【发布时间】:2021-03-12 04:56:48
【问题描述】:
假设我有两张桌子:
Table #1t1
ID | Col1 | MeasureTime | Parameter_ID
----------------------------------------------
1 | abc | 2020-11-11 07:00:00 | 1
2 | abc | 2020-11-11 08:00:00 | 1
Table #2t2
ID | Parameter_ID | Col2 | ValidFrom
----------------------------------------------
1 | 1 | xyz | 2020-11-11 06:30:00
2 | 1 | def | 2020-11-11 07:30:00
我想使用Parameter_ID 加入两个表,并且我想建立 1:1 的关系。 t2 中的ValidFrom 是该参数生效的时间。但不幸的是,没有ValidTo,而是我必须检查我是否加入了t2 中的第一个Parameter_ID,其中ValidFrom 是有效的。
所以我想要这个结果:
Table #3t3
ID | Col1 | MeasureTime | Parameter_ID | ValidFrom | Col2
-----------------------------------------------------------------
1 | abc | 2020-11-11 07:00:00 | 1 | 06:30:00 | xyz
2 | abc | 2020-11-11 08:00:00 | 1 | 07:30:00 | def
但如果我会做一个简单的:
SELECT *
FROM t1
JOIN t2 ON t1.PARAMETER_ID = t2.PARAMETER_ID AND t1.Measuretime >= t2.ValidFrom
我会得到:
Table #3t3
ID | Col1 | MeasureTime | Parameter_ID | ValidFrom | Col2
-----------------------------------------------------------------
1 | abc | 2020-11-11 07:00:00 | 1 | 06:30:00 | xyz
2 | abc | 2020-11-11 08:00:00 | 1 | 06:30:00 | xyz
3 | abc | 2020-11-11 08:00:00 | 1 | 07:30:00 | def
我实际上不想拥有ID 2。
希望我的问题变得清晰。我可以想到类似“如果 t2 有多个结果,则按 ValidFrom ASC 排序并只取第一个”。但不幸的是,我不确定如何使用 SQL 来做到这一点。也许这个问题还有更优雅的解决方案?
【问题讨论】: