从另一个表更新而不重复计算

时间:2013-05-28 12:38:12

标签: sql-server-2008

我有两个表,T1和T2(Sql Server 2008)。

在T2中我没有姓名信息。在T2填写它的最佳方法是什么?

如果我在两个表上进行连接,我会在T2中获得T2的双重计数,因为相同的ID(06)在T1中出现两次。 所以最好做一个更新,但是什么是正确的语法? 感谢您的意见。

T1
Name / ID / car / Country
Joe / 06 / BMW / Italy
Joe / 06 / WW / Italy
Tim / 07 / Jag / Spain


T2
Name / ID / Country
NULL / 06 / NULL
NULL / 07 / NULL

结果应为:

T2
Name / ID / Country
Joe / 06 / Italy
Tim / 07 / Spain

1 个答案:

答案 0 :(得分:2)

可以使用SQL Server专有的UPDATE ... FROM语法。

UPDATE T2
SET T2.Name = T1.Name, 
    T2.Country = T1.Country
FROM T2 JOIN T1 ON T1.ID = T2.ID   

如果T1中存在多个特定ID的行,则会选择任意一行(这会与MERGE进行对比,这将导致事务中止而发现此错误<) p>

编辑:我不完全确定它是在任何地方记录的,上面的两列都是从源中的同一行更新的。在实践中,我确信这将是这种情况,但不依赖于此的方式(执行计划使用未记录的ANY aggregate)将是。

;WITH T AS 
(
SELECT *,
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Country, Name) AS RN
FROM T1       
)
UPDATE T2
SET T2.Name = T.Name, 
    T2.Country = T.Country
FROM T2 JOIN T ON T.ID = T2.ID   
WHERE T.RN = 1