繁体   English   中英

带联合的SQL查询

[英]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

似乎您可以将MAXCASECROSS 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

SQL小提琴演示

结果:

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删除重复项,并且不需要这样做。

给定示例数据,有几种不同的查询将返回您指定的结果集。 但是,当表中的行具有不同的值,不同的基数,不同的行数等时,查询中的差异将变得明显。

需要不同的数据来显示查询中的差异。

举一个例子,给定问题中显示的表foobar中的行,此查询还将返回指定的结果集:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM