2011-11-18 62 views
3

我需要选择最低一组跨越两个表的日期和我的SQL是如此的生疏,我不能想......选择最低加入

我有一个表与一些业务对象:

create table FOO (
    FOO_ID number(19, 0) not null, 
    BAR varchar2(255), 
    primary key (FOO_ID) 
); 

有零或一对多此业务对象日期:

create table A_DATES (
    FOO_ID number(19, 0) not null, 
    A_DATE date not null, 
    primary key (FOO_ID , A_DATE) 
); 

还有另一套零或一对多的日期相同的业务对象:

create table B_DATES (
    FOO_ID number(19, 0) not null, 
    B_DATE date not null, 
    primary key (FOO_ID , B_DATE) 
); 

foo表包含:

+------+--------+ 
|FOO_ID|A_STRING| 
+------+--------+ 
|1  |aaa  | 
|2  |bbb  | 
|3  |ccc  | 
+------+--------+ 

的A_DATES表包含:

+------+-----------+ 
|FOO_ID|A_DATE  | 
+------+-----------+ 
|1  |01-Jan-2001| 
|1  |01-Jan-2002| 
|2  |01-Jan-2003| 
|2  |01-Jan-2004| 
+------+-----------+ 

的B_DATES表包含:

+------+-----------+ 
|FOO_ID|B_DATE  | 
+------+-----------+ 
|1  |01-Jan-2003| 
|1  |01-Jan-2004| 
|2  |01-Jan-2001| 
|2  |01-Jan-2002| 
+------+-----------+ 

我必须写一个选择(所以没有临时表等),它为每个FOO选择两组日期中的最小值,如果有的话。结果集应该是这样的:

+------+--------+-----------+ 
|FOO_ID|A_STRING|MY_DATE | 
+------+--------+-----------+ 
|1  |aaa  |01-Jan-2001| 
|2  |bbb  |01-Jan-2001| 
|3  |ccc  |<null>  | 
+------+--------+-----------+ 

回答

4
select f.FOO_ID, f.A_STRING, min(d.dt) as 'MY_DATE' 
from FOO f 
left join (
    select FOO_ID, min(A_DATE) as dt from A_DATES group by FOO_ID 
    union select FOO_ID, min(B_DATE) as dt from B_DATES group by FOO_ID 
) d 
    on f.FOO_ID = d.FOO_ID 
group by 
    f.FOO_ID, f.A_STRING 
+1

我需要一组由添加到工会的各占一半,但在其他方面,一个很好的答案,快速 –

+0

对此深感抱歉 - 添加它到解决方案的完整性 –