Sql 子查询返回了多个值。如何向列添加更多值?
我试图返回一个查询(sql server和oracle),每个列由不同的查询生成。因此,第一个名为“Presents”的栏目是: 第二列名为“JustifCados”是: 第三列“ausentes”是: 因此,我尝试将所有这些信息放在一个查询中,如: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
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;