2011-11-18 92 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

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