如果值不匹配,SQL更新另一行的值

时间:2018-07-20 20:20:50

标签: sql ssms

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列中的所有内容。

1 个答案:

答案 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中没有匹配项,也将返回所有行。