Hea*_*her 19 sql sql-server-2008
我有一个更新查询,当值与另一个表中的字段不匹配时更新一个表中的字段.
UPDATE table1
SET a.field1 = b.field3
FROM table1 a ,
table2 b
WHERE a.field2 = b.field2
AND a.field1 <> b.field3
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当a.field1为null并且b.field3为值时,如果a.field1为值且b.field3为null,则不会拾取.
我通过添加以下内容来解决这个问题...
UPDATE table1
SET a.field1 = b.field3
FROM table1 a ,
table2 b
WHERE a.field2 = b.field2
AND ( a.field1 <> b.field3
OR (a.field1 IS NOT NULL
AND b.field3 IS NULL)
OR (a.field1 IS NULL
AND b.field3 IS NOT NULL)
)
Run Code Online (Sandbox Code Playgroud)
我的问题更集中在为什么会发生这种情况以及如何最好地构建查询以防止这种情况?
Nor*_*108 10
问题是NULL比较.如果a.field1或b.field3为NULL,则需要使用IS NULL或IS NOT NULL语句.您可以将a.field1和b.field3的默认值与ISNULL函数一起使用.
ISNULL(a.field1,0) <> ISNULL(b.field3,0)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,与值0进行比较.
将任何内容与NULL进行比较的结果,甚至本身,总是为NULL(不是TRUE或FALSE).使用EXISTS和EXCEPT运算符选项.
UPDATE table1
SET a.field1 = b.field3
FROM table1 a JOIN table2 b ON a.field2 = b.field2
WHERE EXISTS (
SELECT a.field1
EXCEPT
SELECT b.field3
)
Run Code Online (Sandbox Code Playgroud)
除了正确处理 NULL 逻辑之外,您还需要将要一起应用的多个条件括在括号中。
像这样的东西(不确定我是否完全理解你的条件)。
UPDATE table1
SET a.field1 = b.field3
FROM table1 a ,
table2 b
WHERE a.field2 = b.field2
AND (
( a.field1 <> b.field3)
OR (a.field1 IS NOT NULL AND b.field3 IS NULL)
OR (a.field1 IS NULL AND b.field3 IS NOT NULL)
)
Run Code Online (Sandbox Code Playgroud)