【问题标题】:Full outer join on 3 tables3张表的全外连接
【发布时间】:2023-04-05 10:54:01
【问题描述】:

我正在尝试从 3 个表中获取所有组合的完整结果集,但它不起作用,因为我不知道如何告诉 SQL-Server 2008 我想要什么。

我已将其简化为以下类似问题...我有 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    |
  ------------------------------------------------------------------------------------------------------- 

使用以下不正确的查询:

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

【问题讨论】:

  • cross join 可能有线索

标签: sql-server sql-server-2008 full-outer-join


【解决方案1】:

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

【讨论】:

  • 我只会在连接条件中使用between
  • between 是否包括范围内的下限但不包括上限?
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2014-10-26
  • 1970-01-01
  • 2017-08-20
  • 2015-09-12
相关资源
最近更新 更多