带联合的SQL查询

时间:2013-04-03 02:19:13

标签: mysql sql

我有以下查询。我做了工会以获得所需的输出,但我没有得到它。

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

感谢您的帮助!

4 个答案:

答案 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)

好像你可以将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 Fiddle Demo

结果:

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 allunion更受欢迎,因为union会删除重复项,而且不需要重复项。

答案 3 :(得分:0)

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

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

作为一个示例,给定问题中显示的表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表中没有“匹配”行,或者当相同的dateFact值出现在多个行中时foo和/或bar表,等等。