В MySQL, как я могу сделать DELETE на основе результата из таблицы, где я сделал INNER JOIN с той же таблицей? - PullRequest
3 голосов
/ 22 июля 2011

ОК, так что я отстой в 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/

Но он для ОБНОВЛЕНИЯ и не использует синтаксис "in".

Я действительно новичок в этом, поэтому любая помощь будет очень признательна. Мне не повезло, используя синтаксис типа «AS blahothertablename» (продолжаю получать ошибки синтаксиса), и я также не могу понять, как сохранить первоначальный подзапрос как временный результат (опять же, ошибки синтаксиса).

Ответы [ 3 ]

2 голосов
/ 22 июля 2011

Используя синтаксис нескольких таблиц в удалении, вам не нужен подзапрос:

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 голос
/ 22 июля 2011

Я думаю, это эквивалентно тому, что вы хотите (при условии, что 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
    ) ;
1 голос
/ 22 июля 2011

Согласно вашему решению, что-то вроде этого должно работать:

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
) 
...