0

在 SQL Server 2008 中:

假设我有两张桌子。

表 1 有 3 个字段:名称、日期 1 和日期 2。目前,所有 Date2 条目都是 NULL。(Name, Date1) 形成一个唯一键。

表 2 有 2 个字段:名称和日期 2。(Name, Date2) 形成一个唯一键。

表 1 中的每个“名称”在表 2 中至少有一个对应的条目。

现在,我想将 Table1 中的所有 Date2 条目(记住它们现在都是 NULL)更新为 Table2 中最接近Table1 中 Date1 的 Date2 条目。即给出以下结果的日期:

 min(datediff(dd,Table1.Date1,Table2.Date2))

所以要清楚,如果我有以下条目:

表格1:

[姓名]:卡尔,[日期 1]:2009 年 1 月 1 日,[日期 2]:NULL

表2:

[姓名]:卡尔,[日期 2]:2000 年 1 月 1 日

[姓名]:卡尔,[日期 2]:2009 年 1 月 7 日

[姓名]:卡尔,[日期 2]:2010 年 1 月 1 日

然后我想将 Table1.Date2 更新为“2009 年 1 月 7 日”,因为那是最接近“2009 年 1 月 1 日”的日期。

非常感谢

卡尔

4

2 回答 2

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 的距离相同但来自不同方面的情况。

于 2009-10-26T06:41:03.127 回答
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)
于 2009-11-10T22:48:07.260 回答