[英]SQL query with union
我有以下查询。 我做了工会以获得所需的输出,但我没有得到。
create table foo (dateFact date, id int);
create table bar (dateFact date, id int);
insert into foo(dateFact, id) values('2013-03-01', 88), ('2013-03-02', 89),('2013-03-03', 90);
insert into bar(dateFact, id) values('2013-03-01', 88), ('2013-03-02', 89),('2013-03-03', 90);
select * from foo;
select * from bar;
(select dateFact, id as idA, 0 from foo order by dateFact) union (select dateFact, 0, id as idB from bar order by dateFact);
上面的查询给我下面的结果:
dateFact idA 0
2013-03-01 88 0
2013-03-02 89 0
2013-03-03 90 0
2013-03-01 0 88
2013-03-02 0 89
2013-03-03 0 90
但我想要:
dateFact idA idB
2013-03-01 88 88
2013-03-02 89 89
2013-03-03 90 90
感谢您的帮助!
包装联合查询,并使用MAX()
对外部查询执行聚合, dateFact
对其进行dateFact
。
SELECT dateFact, MAX(idA) idA, MAX(idB) idB
FROM
(
SELECT dateFact, id AS idA, 0 AS idB FROM foo
UNION
SELECT dateFact, 0 AS idA, id AS idB FROM bar
) s
GROUP BY dateFact
ORDER BY dateFact
似乎您可以将MAX
和CASE
与CROSS JOIN
:
select f.dateFact,
max(case when f.dateFact = b.dateFact then f.id end) IDA,
max(case when f.dateFact = b.dateFact then b.id end) IDB
from foo f cross join bar b
group by f.dateFact
结果:
DATEFACT IDA IDB
March, 01 2013 88 88
March, 02 2013 89 89
March, 03 2013 90 90
我不确定为什么您会对结果感到惊讶。 要获得想要的东西,您需要一个group by
:
select dateFact, max(idA), max(idB)
from ((select dateFact, id as idA, 0
from foo
) union all
(select dateFact, 0, id as idB
from bar
order by dateFact
)
) t
group by dateFact
在这种情况下, union all
优于union
,因为union
删除重复项,并且不需要这样做。
给定示例数据,有几种不同的查询将返回您指定的结果集。 但是,当表中的行具有不同的值,不同的基数,不同的行数等时,查询中的差异将变得明显。
需要不同的数据来显示查询中的差异。
举一个例子,给定问题中显示的表foo
和bar
中的行,此查询还将返回指定的结果集:
SELECT f.dateFact
, f.id AS idA
, b.id AS idB
FROM foo f
JOIN bar b
ON f.dateFact = b.dateFact
ORDER BY f.dateFact
但是,如果表的内容不同,则此查询的结果集将与其他答案中给出的某些查询有很大不同。
(我试图指出该问题没有提供足够的信息来确定哪个查询是“正确”查询。)
您选择使用哪个查询实际上取决于您想要的结果集,例如,在foo或bar表中没有“匹配”行时,或者当foo和bar中的相同dateFact值出现在多行中时/或长方桌,等等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.