这基本上就是我想做的:
delete from course_plan_relationships
where course_plan_relationships.id not in (
select course_plan_relationships.id
from daily_plans inner join
course_plan_relationships on daily_plans.id=course_plan_relationships.daily_plan_id
);
为了让您了解发生了什么,我将向您展示子查询及其结果:
mysql> select course_plan_relationships.id from daily_plans inner join
course_plan_relationships on daily_plans.id=course_plan_relationships.daily_plan_id;
+----+
| id |
+----+
| 1 |
| 13 |
+----+
所以基本上,我想删除 course_plan_relationships 中的所有项目,其中它的 id 字段不在我在子查询中生成的表中。
我得到的错误是:
ERROR 1093 (HY000): 无法指定目标表 “course_plan_relationships”用于 FROM 子句中的更新
我基本上得到的是,出于某种原因,MySQL 不会让你基于涉及同一个表的子查询进行 DELETE 或 UPDATE。
没关系,这是一个假设的解决方法: http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/
但它用于更新并且不使用“in”语法。
我没有使用“AS blahothertablename”类型的语法(不断出现语法错误),而且我也无法弄清楚如何将初始子查询存储为临时结果(再次,语法错误)。
在删除中使用多表语法,不需要子查询:
DELETE course_plan_relationships
FROM course_plan_relationships LEFT JOIN
daily_plans ON course_plan_relationships.daily_plan_id = daily_plans.id
WHERE daily_plans.id IS NULL;
根据您的解决方法,类似这样的事情应该有效:
delete from course_plan_relationships where course_plan_relationships.id not in
(
select x.id from
(
select course_plan_relationships.id from daily_plans
inner join course_plan_relationships
on daily_plans.id=course_plan_relationships.daily_plan_id
) AS x
)
我认为这相当于你想要的(假设
course_plan_relationships.id
是表的主键):
DELETE FROM course_plan_relationships AS cpr
WHERE NOT EXISTS
( SELECT *
FROM daily_plans AS dp
WHERE dp.id = cpr.daily_plan_id
) ;