以下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
在这种特殊情况下,有没有办法改进此查询?
此查询仅使用新值更新具有指定值字段的所有记录。但是如果他们已经是具有新值的记录,我不想更新。这似乎是一种常见的情况。
答案 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;