使用子选择

时间:2017-01-05 20:21:23

标签: mysql sql

我希望通过子选择删除。这个问题的答案并没有解决我的问题:MySQL Error 1093 - Can't specify target table for update in FROM clause

我找到了一种做法的hackish方式,并希望获得反馈,看看这是否是执行DELETE with SUBSELECT的最佳解决方案 -

DELETE FROM main_history WHERE id NOT IN (
   SELECT * from (
     SELECT max(id) FROM main_history h GROUP BY instance_id, xpath
   ) x
)

基本上,我只是添加第二个(无意义的)子选择来解决mysql错误,如果我只使用子选择执行正常的DELETE,我会收到该错误:

DELETE FROM main_history WHERE id NOT IN (
  SELECT max(id) FROM main_history h GROUP BY instance_id, xpath
);
  

您无法指定目标表' main_history'用于FROM子句中的更新

这是解决上述问题的好方法吗?

更新:子选择查询比连接查询执行得更好。以下是我的发现:

# 12m Subselect
DELETE FROM main_history WHERE id NOT IN (
 SELECT * from (
  SELECT max(id) FROM main_history h GROUP BY instance_id, xpath
 ) x
)
# 18m Join
Delete m1 from main_history m1 left join
(
  SELECT max(id) id FROM main_history h GROUP BY instance_id, xpath
) m2 on m1.id = m2.id
Where m2.id is null;

2 个答案:

答案 0 :(得分:2)

正确的方法是使用删除连接:

Delete m1 from main_history m1 left join
(
  SELECT max(id) id FROM main_history h GROUP BY instance_id, xpath
) m2 on m1.id = m2.id
Where m2.id is null;

答案 1 :(得分:0)

您可以使用这样的派生表,然后MySQL无法从SELECT中看到表名:

DELETE FROM main_history WHERE id NOT IN (
   SELECT * FROM (
      SELECT * from (SELECT max(id) FROM main_history h
      GROUP BY instance_id, xpath) AS x
   ) AS delrows
);