mysql 1093错误subselect work-around改进

时间:2014-07-28 03:48:45

标签: mysql sql-update subquery

以下UPDATE查询正常工作:

UPDATE product SET gcode = '9a8a'
WHERE gcode = '81cd'
AND NOT EXISTS (SELECT 1 FROM
    (SELECT 1 FROM product WHERE gcode = '9a8a') AS x
)

但是使用额外的嵌套选择来解决MySQL错误:

1093: You can't specify target table 'product' for update in FROM clause

在这种特殊情况下,有没有办法改进此查询?

此查询仅使用新值更新具有指定值字段的所有记录。但是如果他们已经是具有新值的记录,我不想更新。这似乎是一种常见的情况。

1 个答案:

答案 0 :(得分:1)

如果没有嵌套的选择,那应该没问题:

UPDATE product
    SET gcode = '9a8a'
    WHERE gcode = '81cd' AND
          NOT EXISTS (SELECT 1 FROM trans WHERE trans_gcode = '9a8a');

只有在子查询引用要更新的表时才需要双重嵌套。

编辑:

好吧,你的编辑有一点不同。您可以使用left outer join

执行此操作
UPDATE product p LEFT OUTER JOIN
       trans t
       on trans_gcode = '9a8a'
    SET gcode = '9a8a'
    WHERE gcode = '81cd' AND t.trans_gcode is NULL;