首页 > 解决方案 > 根据 ID 条件连接两个表,并且第一个表中的日期介于另一个表中的其他两个日期之间

问题描述

我正在尝试将表 2 中的时间相关数据添加到表 1。在表 1 中,我有 ID、日期。在表 2 中,我有 ID、DateFrom、DateTo。ID,日期重复。t1 例如:

+-----+------------+------+-------+-------+
| ID  |    day     | Type | data1 | data2 |
+-----+------------+------+-------+-------+
| 111 | 21.07.2019 | -    | …     | …     |
| 111 | 01.08.2019 | -    | …     | …     |
| 111 | 14.08.2019 | -    | …     | …     |
| 112 | 21.07.2019 | -    | …     | …     |
| …   | …          |      | ..    | …     |
+-----+------------+------+-------+-------+

t2:

+-----+------------+------------+------+
| ID  | date_from  |  date_to   | Type |
+-----+------------+------------+------+
| 111 | 01.07.2019 | 03.08.2019 | AAA  |
| 111 | 04.08.2019 | 29.09.2019 | BBB  |
| 111 | 30.09.2019 | 01.12.2019 | CCC  |
| 111 | …          | …          | …    |
+-----+------------+------------+------+

我想要得到的 - 是填充Type来自 t2 的正确数据:

+-----+------------+------+-------+-------+
| ID  |    day     | Type | data1 | data2 |
+-----+------------+------+-------+-------+
| 111 | 21.07.2019 | AAA  | …     | …     |
| 111 | 01.08.2019 | AAA  | …     | …     |
| 111 | 14.08.2019 | BBB  | …     | …     |
| 112 | 21.07.2019 | BBB  | …     | …     |
| …   | …          | …    | ..    | …     |
+-----+------------+------+-------+-------+

我现在所做的:

SELECT TOP 100
t1.ID
t1.day
t2.type

FROM t1 LEFT OUTER JOIN t2 ON ( (t1.date >= t2.date_from) AND (t1.date <=t2.date_to) 
AND (t1.ID = t2.ID) )

这是对的吗?

标签: sqlsql-serverjoin

解决方案


加入似乎是这里的相关方法。

条件周围的括号不是必需的。是否需要 aninner join或 aleft join取决于孤立记录的可能性以及您希望如何处理它们:inner join删除在t1中不匹配的记录t2,而left joins 允许它们(结果type将是null):

select t1.*, t2.type
from t1
inner join t2 on t1.day between t2.date_from and t2.date_to and t2.id = t1.id

推荐阅读