Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过子查询更新,如果子查询不返回行怎么办?_Sql_Database_Subquery_Sql Update_Informix - Fatal编程技术网

Sql 通过子查询更新,如果子查询不返回行怎么办?

Sql 通过子查询更新,如果子查询不返回行怎么办?,sql,database,subquery,sql-update,informix,Sql,Database,Subquery,Sql Update,Informix,我正在更新中使用子查询: 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))) )

我正在更新中使用子查询:

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))) );
我的问题是,如果子查询不返回任何行,会发生什么?它会用空值进行更新吗

第二,有没有更好的方法来写这个。我基本上是在从tableB更新tableA中的三个字段,但只有在这三个字段中的任何一个不同时,才应该进行更新

如果子查询返回,会发生什么 没有争吵?它是否会更新 空值

是-您可以通过以下方式进行测试:

update YourTable
set col1 = (select 1 where 1=0)
这将用空值填充col1。如果子查询返回多行,如:

update YourTable
set col1 = (select 1 union select 2)
数据库将生成一个错误

第二,有没有更好的方法 写这个。我基本上在更新 表B中表A中的三个字段, 但只有在以下情况下才应该进行更新: 这三个字段中的任何一个都是不同的

凭直觉我不会担心性能。如果您确实希望避免更新,可以这样编写:

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)

WHERE子句防止使用NULL进行更新。

在我使用的informix上,是Andomar解决方案的一个变体:

UPDATE a
SET x,y,z = ( (SELECT x, y, z 
               FROM tableB b
               WHERE tableA.id = b.id) )
WHERE tableA.id IN (SELECT fromTable.id
                    FROM tableA toTable, tableB fromTable
                    WHERE toTable.id = fromTable.id
                      AND ((toTable.x <> fromTable.x) 
                           OR (toTable.y <> fromTable.y)
                           OR (toTable.z <> fromTable.z))

此更新是基于tableB的联接参数还是笛卡尔更新?仅当三个字段中的任何一个不同时才应进行更新。听起来像是一个where子句……看起来很不错,只是我忘了提到我正在使用informix IDS 11.5,我不相信informix支持更新中的FROM或加入更新。@prmatta:informix确实支持更新中的FROM;我已经删除了内部连接。@Andomar,我想不会,至少我不会。文档上说是的,但我一直得到一个语法错误。我已将sql更新为不带FROM和JOIN的内容,并将其作为一个答案,如果您觉得合适,请告诉我。@prmatta:您的解决方案看起来是解决Informix限制的一个好办法!