在MySQL中,如何根据表格中的结果执行DELETE,其中我使用相同的表格进行INNER JOIN?

时间:2011-07-22 08:55:18

标签: mysql database subquery temp-tables

好的,所以我很擅长MySQL,但这基本上就是我想做的事情:

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字段不在我在子查询中生成的那个表中。

我得到的错误是:

  

错误1093(HY000):您无法指定目标表   'course_plan_relationships'用于FROM子句中的更新

我基本上得到的是,由于某种原因MySQL不会让你根据涉及同一个表的子查询进行删除或更新。

没关系,这是一个假设的解决方法: http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/

但是它用于UPDATE并且不使用“in”语法。

我对这些东西真的很新,所以任何帮助都会非常感激。我没有运气使用“AS blahothertablename”这种语法(继续获取语法错误),我也无法弄清楚如何将初始子查询存储为临时结果(同样,语法错误)。

3 个答案:

答案 0 :(得分:2)

在删除中使用多表语法,您不需要子查询:

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;

http://dev.mysql.com/doc/refman/5.0/en/delete.html

答案 1 :(得分:1)

根据你的解决方法,这样的事情应该有效:

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
) 

答案 2 :(得分:1)

我认为这相当于你想要的(假设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
    ) ;