Ошибка синтаксиса SQL для удаления нескольких строк из подзапроса - PullRequest
0 голосов
/ 30 августа 2018

У меня есть реляционная база данных MySQL, использующая InnoDB, которая связывает курсы с посетителями курса. Проблема с этой базой данных заключается в том, что столбец course_id в course_attendees не был задан в качестве внешнего ключа. Существует множество курсов, на которые пытается сослаться таблица course_attendees.

Я хотел удалить эти записи, так как курсы больше не принадлежат. Я написал этот запрос выбора, который выбирает все курсы, которые должны быть удалены:

SELECT
    ca.`id`
  FROM `course_attendees` AS ca
    LEFT JOIN `courses` c
      ON ca.`course_id` = c.`id`
  WHERE c.`id` IS NULL

Теперь, когда я пытаюсь обернуть это в запрос DELETE с использованием подзапроса, подобного этому:

DELETE FROM courses AS C1
WHERE C1.`id` IN (
  SELECT
    ca.`id`
  FROM `course_attendees` AS ca
    LEFT JOIN `courses` c
      ON ca.`course_id` = c.`id`
  WHERE c.`id` IS NULL
);

Я получаю следующую ошибку:

[2018-08-30 08:34:26] [42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS C1

[2018-08-30 08:34:26] [42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS C1
[2018-08-30 08:34:26] WHERE C1.`id` IN (
[2018-08-30 08:34:26] SELECT
[2018-08-30 08:34:26] ca.`id`
[2018-08-30 08:34:26] FROM `course_attendees` AS c' at line 1

Поскольку запрос SELECT работает, в чем здесь проблема и как ее исправить?

EDIT

После ответа Тима я понял эту ошибку:

[HY000][1093] You can't specify target table 'courses' for update in FROM clause

1 Ответ

0 голосов
/ 30 августа 2018

Ваш внешний запрос на удаление вообще не связан с подзапросом, поэтому логически вам не нужны псевдонимы:

DELETE
FROM courses
WHERE id IN (
    SELECT id FROM
    (
        SELECT ca.id
        FROM course_attendees AS ca
        LEFT JOIN courses c
            ON ca.course_id = c.id
        WHERE c.id IS NULL
    ) t
);

Я не уверен, что псевдонимы разрешены в операторе удаления только для одной таблицы. Они разрешены для удаления соединения, но вы этого не делаете.

...