2013-05-28 49 views
1

我有两个表T1和T2(Sql Server 2008)。从另一个表更新而不用重复计算

在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 
+0

最好几乎总是不存储两份相同的数据。假设你知道你在做什么,UPDATE FROM查询已经发布为答案应该做你的出价。 –

回答

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的任意一个将有所回升多个行(这constrasts与MERGE这将一个错误中止事务上发现这一点)

编辑:我不是完全可以肯定的是,它在任何地方记录在上面的两列都是从源码中同一行更新的。在实践中,我确信这将是这种情况,但不依赖于此的方式(执行计划使用无证的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