我有两个表,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
答案 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