通过子查询更新,如果子查询没有返回行怎么办?
我在更新中使用子查询:
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))) );
我的问题是,如果子查询不返回任何行,会发生什么?它会用空值进行更新吗?
其次,有没有更好的写法。我基本上是从表 B 更新表 A 中的三个字段,但只有在这三个字段中有任何一个不同时才应进行更新。
I am using a subquery in an 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))) );
My question is, what happens if the subquery returns no rows? Will it do an update with nulls?
Secondly, is there a better way to write this. I am basically updating three fields in tableA from tableB, but the update should only happen if any of the three fields are different.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的——您可以这样测试:
这将用 NULL 填充 col1。如果子查询返回多行,例如:
数据库将生成错误。
直觉上我不会担心性能。如果您确实希望避免更新,可以这样写:
WHERE
子句防止使用 NULL 进行更新。Yes-- you can test this like:
This will fill col1 with NULLs. In case the subquery returns multiple rows, like:
The database will generate an error.
Intuitively I wouldn't worry about the performance. If you really wish to avoid the update, you can write it like:
The
WHERE
clause prevents updates with NULL.在 informix 上,我使用了 Andomar 解决方案的变体:
On informix I used, a variation of Andomar's solution: