2015-11-25 57 views
1

我想从3个表中获得所有组合的完整结果集,但它不工作,因为我无法弄清楚如何告诉SQL-Server 2008我想要什么。在3个表上完全外连接

我已经简化它归结为以下类似的问题...我有3个表:

table `date_ranges`: 
    -------------------------------------------------------- 
| start_day     | end_day      | 
| -------------------------------------------------------- | 
| November, 01 2015 14:37:00 | November, 02 2015 00:00:00 | 
| November, 02 2015 00:00:00 | November, 03 2015 00:00:00 | 
| November, 03 2015 00:00:00 | November, 04 2015 00:00:00 | 
| November, 04 2015 00:00:00 | November, 04 2015 02:00:00 | 
    -------------------------------------------------------- 

table `sites`: 
    ---- 
| site | 
| ---- | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
    ---- 

table `all_data`: 
    -------------------------------------- 
| data_date     | data_site | 
| ---------------------------|---------- | 
| November, 02 2015 15:35:00 | 1   | 
    -------------------------------------- 

,我希望得到以下结果:

------------------------------------------------------------------------------------------------------- 
| data_date     | data_site | start_day     | end_day     | site | 
| ------------------------------------------------------------------------------------------------------- | 
| null      | null  | November, 01 2015 14:37:00 | November, 02 2015 00:00:00 | 1 | 
| November, 02 2015 15:35:00 | 1   | November, 02 2015 00:00:00 | November, 03 2015 00:00:00 | 1 | 
| null      | null  | November, 03 2015 00:00:00 | November, 04 2015 00:00:00 | 1 | 
| null      | null  | November, 04 2015 00:00:00 | November, 04 2015 02:00:00 | 1 | 
| null      | null  | November, 01 2015 14:37:00 | November, 02 2015 00:00:00 | 2 | 
| null      | null  | November, 02 2015 00:00:00 | November, 03 2015 00:00:00 | 2 | 
| null      | null  | November, 03 2015 00:00:00 | November, 04 2015 00:00:00 | 2 | 
| null      | null  | November, 04 2015 00:00:00 | November, 04 2015 02:00:00 | 2 | 
| null      | null  | November, 01 2015 14:37:00 | November, 02 2015 00:00:00 | 3 | 
| null      | null  | November, 02 2015 00:00:00 | November, 03 2015 00:00:00 | 3 | 
| null      | null  | November, 03 2015 00:00:00 | November, 04 2015 00:00:00 | 3 | 
| null      | null  | November, 04 2015 00:00:00 | November, 04 2015 02:00:00 | 3 | 
| null      | null  | November, 01 2015 14:37:00 | November, 02 2015 00:00:00 | 4 | 
| null      | null  | November, 02 2015 00:00:00 | November, 03 2015 00:00:00 | 4 | 
| null      | null  | November, 03 2015 00:00:00 | November, 04 2015 00:00:00 | 4 | 
| null      | null  | November, 04 2015 00:00:00 | November, 04 2015 02:00:00 | 4 | 
    ------------------------------------------------------------------------------------------------------- 

而是我只能弄清楚如何得到如下结果(see fiddle here):

------------------------------------------------------------------------------------------------------- 
| data_date     | data_site | start_day     | end_day     | site | 
| ------------------------------------------------------------------------------------------------------- | 
| null      | null  | November, 01 2015 14:37:00 | November, 02 2015 00:00:00 | null | 
| November, 02 2015 15:35:00 | 1   | November, 02 2015 00:00:00 | November, 03 2015 00:00:00 | 1 | 
| null      | null  | November, 03 2015 00:00:00 | November, 04 2015 00:00:00 | null | 
| null      | null  | November, 04 2015 00:00:00 | November, 04 2015 02:00:00 | null | 
| null      | null  | null      | null      | 2 | 
| null      | null  | null      | null      | 3 | 
| null      | null  | null      | null      | 4 | 
    ------------------------------------------------------------------------------------------------------- 

使用foll由于不正确的查询:

select * from all_data d 
full outer join date_ranges r on (r.start_day <= d.data_date and d.data_date < r.end_day) 
full outer join sites s on s.site = d.data_site 
+0

'交join'可以持有线索 – mulllhausen

回答

5

CROSS JOINLEFT JOIN组合应该为你做的伎俩。

事情是这样的..

SQL Fiddle

SELECT * 
FROM DATE_RANGES R 
    CROSS JOIN SITES S 
    LEFT OUTER JOIN ALL_DATA D ON (R.START_DAY <= D.DATA_DATE AND D.DATA_DATE < R.END_DAY) 
             AND S.SITE = D.DATA_SITE 
+0

我只想在连接条件 – Bohemian

+0

使用'between'确实'between'包括较低但不范围中的上限日期? – mulllhausen