如何从SQL中不相关的表中获取参考值

时间:2018-11-09 18:15:17

标签: sql sql-server tsql

我目前有两个带有以下内容的表

+-----+-------+-------------------------+
| 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? 即

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

我觉得case when语句在这里可以很好地使用,但是我不确定该怎么做,因为没有适当的ID就无法JOIN。我写了

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行和值包含多年且没有一致的模式。

2 个答案:

答案 0 :(得分:2)

进行连接而不是大小写还是更好。而且您不必具有“正确的ID”。请尝试以下操作。

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语句中选择前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”。

答案 1 :(得分:0)

您的预期输出是将Create_timestampStart_date链接在一起。

示例:

DECLARE 
    @t1 TABLE(ID INT, val VARCHAR(5),  Create_timestamp DATETIME) 

INSERT INTO @t1 VALUES 
(001,'A','2018-01-01 12:00:10'),
(002,'B','2018-02-15 08:17:00'),
(003,'C','2018-03-10 00:00:00')


DECLARE 
    @t2 TABLE(Start_date DATETIME, End_date DATETIME, PERIOD VARCHAR(50), CODE VARCHAR(50))

INSERT INTO @t2 VALUES 
('2018-01-01 00:00:00','2018-01-10 00:00:00','PERIOD1','ABCC'),
('2018-01-10 00:00:00','2018-02-08 00:00:00','PERIOD2','ABCC'),
('2018-02-08 00:00:00','2018-02-15 00:00:00','PERIOD3','DEFF'),
('2018-02-15 00:00:00','2018-03-01 00:00:00','PERIOD4','EFGG')


SELECT t1.ID, t2.PERIOD, t2.CODE 
FROM @t1 t1
JOIN @t2 t2 ON CAST(t1.Create_timestamp AS DATE) = CAST(t2.Start_date AS DATE)