2013-04-03 30 views
1

我有以下查询。我做了工会,以获得所需的输出,但我没有得到它。与联盟的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 

感谢您的帮助!

回答

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 
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删除重复和没有必要的。

+1

因为使用MAX(),所以没有必要使用'UNION ALL'。 – Pedigree

+1

@CommanderOnets。 。 。 'union'招致不必要的删除重复的开销,这在这种情况下是不需要的。 “all all”是更好的选择。 –

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 
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表格中的多行中时,您需要什么结果集,等等。