4

错误 1093 指出,如果您的子查询查询您要从中删除的表,则您无法使用子查询进行更新或删除。

所以你不能做

delete from table1 where id in (select something from table1 where condition) ;

好的,解决该限制的最佳方法是什么(假设您确实需要子查询来执行删除并且不能完全消除自引用子查询?)

编辑:

以下是感兴趣的人的查询:

mysql> desc 邻接;
+---------+---------+------+-----+---------+------ -+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+---------+---------+------+-----+---------+------ -+
| 家长 | 整数(11) | 否 | 优先级 | 空 | |
| 孩子| 整数(11) | 否 | 优先级 | 空 | |
| 路径长度 | 整数(11) | 否 | | 空 | |
+---------+---------+------+-----+---------+------ -+



-- 查询将
——告诉我所有的孩子
——别再想我的老父母了
——仍然是他们的父母

从邻接中删除
父母在哪里
(
-- 我所有的父母,祖父母
  选择父母
  从邻接
  孩子=@我
  和父母!=@我
)

——只涉及我的关系
-- 关心我孩子的祖父母
和孩子在
(
  ——带上我所有的孩子
  选择孩子
  从邻接
  哪里父母=@我
)

;

所以到目前为止我尝试的是创建一个名为的临时表adjsToDelete

create temporary table adjsToRemove( parent int, child int ) ;
insert into adjsToRemove...

所以现在我有一个要删除的关系集合,其中父/子对每个唯一地标识要删除的行。但是我现在如何从邻接表中删除每一对呢?

看来我需要为auto_increment每个条目添加一个唯一的 ed 键adjacencies,对吗?

4

5 回答 5

8

http://bugs.mysql.com/bug.php?id=6980中找到的对我有用的解决方法是为将返回项目的子查询创建一个别名。所以

delete from table1 where id in 
  (select something from table1 where condition)

将更改为

delete from table1 where id in
  (select p.id from (select something from table1 where condition) as p)
于 2013-03-21T14:27:38.730 回答
2

你可以做

delete t1,t2 
FROM  table1 t1  
INNER JOIN 
table1 t2 ON (t2.something = t1.id);

对于问题中的查询,这应该是等效的:

delete A
from adjacencies A
join adjacencies B ON A.parent = B.parent AND B.child=@me AND B.parent != @me
join adjacencies C ON A.child = C.child AND C.parent=@me
于 2010-12-19T20:18:47.887 回答
1

Currently, you cannot delete from a table and select from the same table in a subquery -细节

您只是不能指定要删除的目标表

我的解决方法之一:MySQL DELETE FROM 以子查询为条件

于 2010-12-20T02:43:23.097 回答
1

简化:

-- Collect ids
CREATE TEMPORARY TABLE cleanup_lookup AS 
SELECT id FROM table1 WHERE condition;

-- Delete the selected records
DELETE t FROM table1 t INNER JOIN cleanup_lookup l ON t.id = l.id;

-- Temporary tables get dropped when the connection is closed.
于 2013-03-12T12:02:59.853 回答
0

你可以毫不犹豫地使用这个。

您的查询:

delete from table1 
where id in (select something from table1 where condition);

更新查询:

DELETE FROM table1 
WHERE id IN (SELECT * 
             FROM 
                 (SELECT MIN(id) FROM table1 GROUP BY Column2) x);

Column2是您要在其上查找重复记录的列。

于 2017-09-16T02:28:52.390 回答