在SQL Server 2008中:
假设我有两张桌子。
Table1有3个字段:Name,Date1和Date2。目前,所有Date2条目都是NULL。 (Name,Date1)形成一个唯一的密钥。
Table2有2个字段:Name和Date2。 (名称,日期2)形成一个唯一的密钥。
表1中的每个“名称”在表2中至少有一个相应的条目。
现在,我想将Table1中的所有Date2条目(请记住它们现在都是NULL)更新到Table2中的Date2条目,即Table1中与Date1的最接近。即给出结果的日期:
min(datediff(dd,Table1.Date1,Table2.Date2))
所以要清楚,如果我有以下条目:
表1:
[姓名]:卡尔,[日期1]:2009年1月1日,[日期2]:空白
表2:
[姓名]:Karl,[Date2]:1/1/2000
[姓名]:卡尔,[日期2]:2009年1月7日
[姓名]:卡尔,[日期2]:2010年1月1日
然后我想将Table1.Date2更新为'1/7/2009',因为这是'1/1/2009'的最近日期。
非常感谢
卡尔
答案 0 :(得分:1)
UPDATE Table1
SET Date2 = t2.Date2
FROM Table1 t1
JOIN Table2 t2
ON t1.Name = t2.Name
AND ABS(DATEDIFF(d, t1.Date1, t2.Date2)) = (SELECT MIN(ABS(DATEDIFF(d, t1.Date1, t2.Date2)))
FROM Table1 t1
JOIN Table2 t2
ON t1.Name = t2.Name
)
检查您是否需要ABS
- 我想你会这样做。
此查询也不处理Table2中有2个日期与Date1的距离相同但来自不同边的情况。
答案 1 :(得分:1)
WITH abcd AS
(
SELECT t1.Name,t1.Date1, t2.Date2
,RANK() OVER (ORDER BY ABS(DATEDIFF(dd, t1.Date1, t2.Date2)) ASC) AS rnk
FROM
Table1 AS t1
JOIN Table2 AS t2 ON t1.Name = t2.Name
)
UPDATE Table1 SET
[Date2] = (SELECT TOP(1) [Date2] FROM abcd WHERE rnk = 1)