Соедините две таблицы при условии идентификатора, и дата из первой таблицы находится между двумя другими датами в другой таблице

Я пытаюсь добавить в таблицу 1 временные данные из таблицы 2. В таблице 1 у меня есть идентификатор, дата. В таблице 2 у меня есть ID, DateFrom, DateTo. Идентификаторы, даты повторяются. 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) )

Это правильно?

Всего 1 ответ


Объединение кажется подходящим подходом здесь.

Скобки вокруг условий не обязательны. Требуется ли вам inner join или left join зависит от возможности потерянных записей и от того, как вы хотите их обрабатывать: inner join удаляет записи в t1 , которые не имеют совпадений в t2 , в то время как left join разрешает их (результирующий 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

Есть идеи?

10000