我有以下查询。我做了工会以获得所需的输出,但我没有得到它。
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
感谢您的帮助!
答案 0 :(得分:1)
使用MAX()
换行联合查询并对外部查询执行聚合,并按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
答案 1 :(得分:1)
好像你可以将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
答案 2 :(得分:0)
我不确定为什么你会对结果感到惊讶。要获得所需内容,您需要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
会删除重复项,而且不需要重复项。
答案 3 :(得分:0)
在给定示例数据的情况下,有几个不同的查询将返回指定的结果集。但是当表中的行具有不同的值,不同的基数,不同的行数等时,查询中的差异将变得明显。
需要使用不同的数据来显示查询中的差异。
作为一个示例,给定问题中显示的表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表中没有“匹配”行,或者当相同的dateFact值出现在多个行中时foo和/或bar表,等等。