MySQL:在UPDATE语句中处理EMPTY SET

时间:2014-06-04 18:32:21

标签: mysql sql

我有:类似

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!!
);

3 个答案:

答案 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_tableid至少存在一行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;空集",表示有零行需要更新。