仅当非空时,SQL Server值才从另一个表更新

时间:2013-07-26 14:45:37

标签: sql-server null sql-update

我正在尝试使用表{B}列中的值更新表A的列,该列基于if Table A.col1 = TableB.Col1

问题:如果在Null中找不到Col1,我会使用TableB.Col1覆盖TableA列值。

我当前的查询是

UPDATE [tableA]
SET col2 = (SELECT col2 FROM [tableB] WHERE [TableB].col1 = [TableA].col1)

我该如何避免这种情况?

Ex:TableA

Col1 Col2
1    100
2    200
3    300

表B

Col1 Col2
1    1000
3    3000

结果表应为:

表A

Col1 Col2
1    1000
2    200
3    3000

但我明白了:

Col1 Col 2
1    1000
2    null
3    3000

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您不希望更新整个表,因此您的查询需要where子句。在这种情况下:

WHERE exists (select 1 
                from [tableB] 
                where [TableB].col1=[TableA].col1 
                  and [TableB].col2 is not NULL -- that condition may or may not be needed 
             )

答案 1 :(得分:1)

你可以这样做:

UPDATE [tableA]
SET col2 = COALESCE(
             (SELECT col2 FROM [tableB] WHERE [TableB].col1 = [TableA].col1),
             col2)

COALESCE返回其参数中的第一个非NULL表达式。

或者,你可以这样做:

UPDATE a
SET col2 = b.col2
FROM TableA a
    INNER JOIN
     TableB b
        ON
            a.col1 = b.col1

但是你应该知道第二种形式是SQL Server方言,而不是标准SQL。

答案 2 :(得分:0)

应该这样做,不是吗?

UPDATE [tableA]
SET col2= (select col2 from [tableB] where [TableB].col1=[TableA].col1 and [TableB].col1 IS NOT NULL )