我有:类似
UPDATE table
SET field = (SELECT field FROM another_table WHERE id = @id);
问题: SELECT field FROM another_table WHERE id = @id
子查询可以返回一个字段或 EMPTY SET 。
问题: 子查询返回空集时如何处理情况?
更新
UPDATE table t
SET field = IF((SELECT field FROM another_table WHERE id = @id) IS NOT NULL, -- select field
(SELECT field FROM another_table WHERE id = @id), -- Problem #1: select field AGAIN!
(SELECT field FROM table WHERE id = t.id) -- Problem #2: try to not change value, so select the current field value!!
);
答案 0 :(得分:1)
如果功能有用:
UPDATE table
SET field = if((SELECT field FROM another_table WHERE id = @id) IS NULL,true,false);
答案 1 :(得分:1)
您可以添加条件:
WHERE (SELECT COUNT(*) FROM another_table WHERE id = @id) > 0
这将确保another_table
中id
至少存在一行another_table
。以我的SQL Fiddle为例。
注意:这可能不是最有效的,因为它会对SELECT
进行计数,如果它大于1,它将执行另一个INNER JOIN
(两个子查询)。相反,您可以执行UPDATE table
INNER JOIN another_table ON table.id=another_table.id
SET table.field = another_table.field
WHERE another_table.id = @id;
:
UPDATE
见SQL Fiddle。我之所以将其保存为第二个选项,并不是所有SQL语言都可以table.id
加入(MySQL可以)。此外,您需要一些方法来关联表格。在这种情况下,我说我们正在更新的another_table.id
等于我们从中获取数据的{{1}}。
答案 2 :(得分:1)
注意 UPDATE
语句将修改table
中的每一行,并为每一行分配相同的值;这似乎有点不寻常。
回答你的问题:
如果你想处理"空集"通过不更新table
中的任何行,然后一种方法是使用JOIN到内联视图:
UPDATE table t
CROSS
JOIN (SELECT a.field
FROM another_table a
WHERE a.id = @id
LIMIT 1
) s
SET t.field = s.field
请注意,如果内联视图查询(别名为s)返回"空集",则table
中的任何行都不会更新,因为JOIN操作也会返回&# 34;空集",表示有零行需要更新。