Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 子查询返回了多个值。如何向列添加更多值?_Sql - Fatal编程技术网

Sql 子查询返回了多个值。如何向列添加更多值?

Sql 子查询返回了多个值。如何向列添加更多值?,sql,Sql,我试图返回一个查询(sql server和oracle),每个列由不同的查询生成。因此,第一个名为“Presents”的栏目是: 第二列名为“JustifCados”是: 第三列“ausentes”是: 因此,我尝试将所有这些信息放在一个查询中,如: SELECT (SELECT TABLE1.NAME FROM TABLE1 WHERE TABLE1.SESSION = 92) AS presentes, (SELECT TABLE2.NAME FROM TABLE2 WHERE TABLE2

我试图返回一个查询(sql server和oracle),每个列由不同的查询生成。因此,第一个名为“Presents”的栏目是:

第二列名为“JustifCados”是:

第三列“ausentes”是:

因此,我尝试将所有这些信息放在一个查询中,如:

SELECT (SELECT TABLE1.NAME FROM TABLE1 WHERE TABLE1.SESSION = 92) AS presentes,
(SELECT TABLE2.NAME FROM TABLE2 WHERE TABLE2.SESSION = 92 AND TABLE2.DATE > '[somedateGoesHere]') as justificados,
(SELECT TABLE3.NAME FROM TABLE3 WHERE TABLE3.SESSION = 92) as ausentes
这个想法是这样的:

但我收到了这个错误:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时


我知道这是因为第三列的值大于1。但是我如何向其他列添加“null”值来修复它呢?

从表3开始,对其他两个列进行左连接

SELECT t1.NAME as presentes, t2.name AS justificados, t3.NAME as ausentes
FROM TABLE3 t3
LEFT JOIN TABLE1 t1 ON t3.session = t1.session
LEFT JOIN TABLE2 t2 ON t3.session = t2.session
WHERE t3.SESSION = 92 
  AND t2.DATE = '[someDate]'
或者,可以在联接中直接使用最后一个where条件

SELECT t1.NAME as presentes, t2.name AS justificados, t3.NAME as ausentes
FROM TABLE3 t3
LEFT JOIN TABLE1 t1 ON t3.session = t1.session
LEFT JOIN TABLE2 t2 ON t3.session = t2.session AND t2.DATE = '[someDate]'
WHERE t3.SESSION = 92 

你可以用所有的

SELECT TABLE1.NAME as presentes,
'' as justificados,'' as ausentes FROM TABLE1 
WHERE TABLE1.SESSION = 92
union all
SELECT '',TABLE2.NAME,'' FROM TABLE2 WHERE TABLE2.SESSION = 92 AND TABLE2.DATE > '[somedateGoesHere]'
union all
  SELECT '','', TABLE3.NAME FROM TABLE3 WHERE TABLE3.SESSION = 92

您可以将
row\u number()
union all
一起使用,执行条件聚合:

select max(case when tb = 'table1' then name end) as presentes,
       max(case when tb = 'table2' then name end) as justificados,
       max(case when tb = 'table3' then name end) as ausentes
from (select 'table1' as tb, name, row_number() over (order by (select 1)) as seq
      from table1 
      where SESSION = 92 
      union all
      select 'table2', name, row_number() over (order by (select 1))  
      from table2
      where SESSION = 92 AND DATE > '[somedateGoesHere]' 
      union all
      select 'table3', name, row_number() over (order by (select 1))  
      from table3
      where SESSION = 92
     ) t
group by seq;

这有意义吗?您的列是不相关的数据集。为什么要将它们放在一个表中?因为我使用的是Jasper report,我只需要在1个数据集中设置这些信息。为什么要3列?使用union all标记每个查询来知道数据来自何处还不够吗?如果你想的话,你可以旋转,但不确定为什么你需要columnsCan中奇怪的无关数据,你给我举个例子?正如我所说的,这将转化为Jasper的报告,但是Jasper有一些限制,所以我需要把这个无关的查询放在一起,因为每个子查询的子句都不同。你的意思是session不是所有子查询的值都相同?为什么会投反对票?会话值相同,但WHERE子句不同。正如你在我的主页上看到的,有些有日期比较question@aseolin是的,我的where子句中也有!看最后一排。
SELECT t1.NAME as presentes, t2.name AS justificados, t3.NAME as ausentes
FROM TABLE3 t3
LEFT JOIN TABLE1 t1 ON t3.session = t1.session
LEFT JOIN TABLE2 t2 ON t3.session = t2.session AND t2.DATE = '[someDate]'
WHERE t3.SESSION = 92 
SELECT TABLE1.NAME as presentes,
'' as justificados,'' as ausentes FROM TABLE1 
WHERE TABLE1.SESSION = 92
union all
SELECT '',TABLE2.NAME,'' FROM TABLE2 WHERE TABLE2.SESSION = 92 AND TABLE2.DATE > '[somedateGoesHere]'
union all
  SELECT '','', TABLE3.NAME FROM TABLE3 WHERE TABLE3.SESSION = 92
select max(case when tb = 'table1' then name end) as presentes,
       max(case when tb = 'table2' then name end) as justificados,
       max(case when tb = 'table3' then name end) as ausentes
from (select 'table1' as tb, name, row_number() over (order by (select 1)) as seq
      from table1 
      where SESSION = 92 
      union all
      select 'table2', name, row_number() over (order by (select 1))  
      from table2
      where SESSION = 92 AND DATE > '[somedateGoesHere]' 
      union all
      select 'table3', name, row_number() over (order by (select 1))  
      from table3
      where SESSION = 92
     ) t
group by seq;