通过子查询更新,如果子查询没有返回任何行,该怎么办?

rou*_*ble 5 sql database informix subquery sql-update

我在UPDATE中使用子查询:

UPDATE tableA 
SET x,y,z = ( (SELECT x, y, z 
               FROM tableB b
               WHERE tableA.id = b.id
                 AND (tableA.x != b.x
                      OR tableA.y != b.y
                      OR tableA.z != b.z))) );
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果子查询没有返回任何行会发生什么?它会用null做更新吗?

其次,有没有更好的方法来写这个.我基本上从tableB更新tableA中的三个字段,但只有当三个字段中的任何一个不同时才会发生更新.

And*_*mar 6

如果子查询没有返回任何行,会发生什么?它会用null做更新吗?

是的 - 你可以测试这个:

update YourTable
set col1 = (select 1 where 1=0)
Run Code Online (Sandbox Code Playgroud)

这将用cols填充col1.如果子查询返回多行,例如:

update YourTable
set col1 = (select 1 union select 2)
Run Code Online (Sandbox Code Playgroud)

数据库将生成错误.

其次,有没有更好的方法来写这个.我基本上从tableB更新tableA中的三个字段,但只有当三个字段中的任何一个不同时才会发生更新.

直观地说,我不担心性能.如果您真的希望避免更新,可以像下面这样写:

UPDATE a
SET x = b.x, y = b.y, z = b.z
FROM tableA a, tableB b 
WHERE a.id = b.id AND (a.x <> b.x OR a.y <> b.y OR a.z <> b.z)
Run Code Online (Sandbox Code Playgroud)

WHERE子句阻止使用NULL进行更新.