sql - 根据 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) )
这是对的吗?
解决方案
加入似乎是这里的相关方法。
条件周围的括号不是必需的。是否需要 aninner join
或 aleft 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
推荐阅读
- visual-studio - 有没有办法使用键盘快捷键在 Visual Studio 中选择特定选项卡?
- maven - 为什么我不能加载类 org.slf4j.impl.StaticLoggerBinder
- vue.js - Vue-Apollo GraphQL Mutation 未正确调用
- react-native - React Navtive GET 请求期间的 Okhttp 错误
- python - 从数组中提取特定元素以创建范围
- python - Python - 求解未知值,使列最小值等于某个数字
- python - 对 Django 模板的更改未反映
- c++ - 合并排序的分治法
- python - 我可以在异步循环任务旁边运行消息侦听器吗?
- javascript - 将鼠标悬停在 JavaScript Canvas 中的按钮上的问题