1

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

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

4 回答 4

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
于 2013-04-03T02:20:44.713 回答
1

似乎您可以使用MAXand :CASECROSS 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
于 2013-04-03T02:35:05.373 回答
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删除重复项并且不需要。

于 2013-04-03T02:22:05.887 回答
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 和/或吧台,等等。

于 2013-04-03T02:53:18.590 回答