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

Я пытаюсь добавить в таблицу 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 Ответ

1 голос
/ 26 марта 2020

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

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