MySQL:处理UPDATE语句中的空集

MySQL:处理UPDATE语句中的空集,mysql,sql,Mysql,Sql,我有:差不多 UPDATE table SET field = (SELECT field FROM another_table WHERE id = @id); 问题:从另一个_表中选择字段,其中id=@id子查询可以返回一个字段或空集 问题:如何处理子查询返回空集的情况 更新: 如果功能有用: UPDATE table SET field = if((SELECT field FROM another_table WHERE id = @id) IS NULL,true,false);

我有:差不多

UPDATE table
SET field = (SELECT field FROM another_table WHERE id = @id);
问题:从另一个_表中选择字段,其中id=@id子查询可以返回一个字段或空集

问题:如何处理子查询返回空集的情况

更新:


如果功能有用:

UPDATE table
SET field = if((SELECT field FROM another_table WHERE id = @id) IS NULL,true,false);

您可以添加以下条件:

WHERE (SELECT COUNT(*) FROM another_table WHERE id = @id) > 0
这将确保id为的另一个_表中至少存在一行。以my为例

注意:这可能不是最有效的,因为它对另一个_表进行计数,如果它大于1,它将执行另一个SELECT two子查询。相反,您可以执行内部联接:

看这个。我之所以将此保存为第二个选项,是因为并非所有SQL语言都可以使用MySQL更新。另外,您还需要一些方法来关联表。在本例中,我说我们正在更新的table.id等于我们从中获取数据的另一个_table.id。

注意UPDATE语句将修改表中的每一行,并为每一行指定相同的值;这似乎有点不寻常

回答你的问题:

如果要通过不更新表中的任何行来处理空集,则一种方法是连接到内联视图:

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的内联视图查询返回一个空集,则表中的任何行都不会更新,因为联接操作也将返回一个空集,这意味着要更新的行为零。

我有另一个表中的IFSELECT字段,其中id=@id不为NULL,true\u expr,false\u expr。问题:实际上,我的true_expr等于从另一个_表中选择字段,其中id=@id。问题:如何避免选择sme值两次?如果两个id都是唯一的,则应该可以。如果没有详细说明你的情况,请看我问题的更新部分
UPDATE table
INNER JOIN another_table ON table.id=another_table.id
SET table.field = another_table.field
WHERE another_table.id = @id;
UPDATE table t
 CROSS
  JOIN (SELECT a.field 
          FROM another_table a
         WHERE a.id = @id
         LIMIT 1
       ) s
   SET t.field = s.field