SQL新手在这里。我正在尝试使用同一表中另一行的值更新特定值的行。但是,我希望初始值仅在它为null或与新值不匹配时才更新。
我当前未完成的脚本:
DECLARE @Record1 VARCHAR(50) = 'ID1',
@Record2 VARCHAR(50)='ID2'
UPDATE R1
SET r1.column1 = COALESCE(r1.column1, r2.column1),
r1.column2 = COALESCE(r1.column2, r2.column2),
r1.column3 = COALESCE(r1.column3, r2.column3),
r1.column4 = COALESCE(r1.column4, r2.column4)
FROM TABLE1 r1
INNER JOIN TABLE1 r2 ON r1.ID1 = @Record1 AND r2.ID2 = @Record2
我当前正在使用SQL Server 2016 Management Studio。
编辑:
阅读Sgeddes的回复后,我意识到我的问题很愚蠢。当然,从Record2替换Record1中的所有内容最有意义。
我想我要寻找的是是否有办法在每个列上放置条件以进行更新。例如,如果我只想在NULL时更新Record1的第1列和第2列,而是替换Record2的第3列和第4列中的所有内容。
答案 0 :(得分:0)
您将使用left join
。 。 。小心:
UPDATE R1
SET r1.column1 = coalesce(r1.column1, r2.column1),
r1.column2 = coalesce(r1.column2, r2.column2),
r1.column3 = coalesce(r1.column3, r2.column3),
r1.column4 = coalesce(r1.column4, r2.column4)
FROM TABLE1 r1 LEFT JOIN
TABLE1 r2
ON r2.ID2 = @Record2
WHERE r1.ID1 = @Record1 ;
请注意,r1
上的条件位于where
子句中,因此它实际上过滤了行。 t2
的条件保留在on
子句中,因此即使r2
中没有匹配项,也将返回所有行。