首页 > 解决方案 > 如何从 SQL 中不相关的表中获取参考值

问题描述

我目前有两个表,其中包含以下内容

+-----+-------+-------------------------+
| ID  | Value |    Create_timestamp     |
+-----+-------+-------------------------+
| 001 | A     | 2018-01-01 12:00:10.102 |
| 002 | B     | 2018-02-15 08:17:00.000 |
| 003 | C     | 2018-03-10 00:00:00.000 |
+-----+-------+-------------------------+

+-------------------------+-------------------------+---------+------+
|       Start_date        |        End_date         | PERIOD  | CODE |
+-------------------------+-------------------------+---------+------+
| 2018-01-01 00:00:00.000 | 2018-01-10 00:00:00.000 | PERIOD1 | ABCC |
| 2018-01-10 00:00:00.000 | 2018-02-08 00:00:00.000 | PERIOD2 | ABCC |
| 2018-02-08 00:00:00.000 | 2018-02-15 00:00:00.000 | PERIOD3 | DEFF |
| 2018-02-15 00:00:00.000 | 2018-03-01 00:00:00.000 | PERIOD4 | EFGG |
+-------------------------+-------------------------+---------+------+

有没有办法将它组合起来,以便我根据第一个表的 create_timestamp 从第二个表中获取 PERIOD 和 YEAR?IE

+-----+----------+------+
| 001 | PERIOD 1 | ABCC |
| 002 | PERIOD 4 | EFGG |
+-----+----------+------+

我觉得case when在这里使用语句会很好,但我不知道该怎么做,因为JOIN没有正确的 ID 是没有办法的。我写过

SELECT a.ID, a.Value
    , CASE WHEN a.create_timestamp BETWEEN b.state_date and b.end_date THEN b.PERIOD END
    , CASE WHEN a.create_timestamp BETWEEN b.start_date AND b.end_date THEN b.CODE END
FROM a

但这就是我卡住的地方。

我会手动创建一个case when语句并插入值,但是有 194 行和包含多年的值并且没有一致的模式。

标签: sqlsql-servertsql

解决方案


与 case 相比,进行 join 仍然更好。而且您不必拥有“正确的身份”。试试下面的。

select    ts.id, ts.value, p.period, p.code
from      timeStamps ts
left join periods p on ts.create_timestamp between p.start_date and p.end_date

但请注意,从技术上讲,您有重叠的范围。您可以在 case 语句中执行 select top 1 子查询,也可以执行以下操作:

select    ts.id, ts.value, p.period, p.code
from      timeStamps ts
left join periods p 
             on ts.create_timestamp >= p.start_date 
             and ts.create_timestamp < p.end_date

并且只需了解您的结束日期是一个上限,但如果实际达到,则不会达到(您需要另一个具有适当开始日期的范围才能达到它)。

顺便说一句,我给出了一个左连接,它仍然会为 003 输出一行,但它只会将“null”作为引用表的值。如果您真的想避免这种情况,请改为使用“内部连接”。

顺便说一句(绝对不是在这里小气),但这些表并不是“无关的”。事实上,它们非常相关,这就是为什么最好使用“关系”运算符“join”。


推荐阅读