我有一个使用InnoDB的关系MySQL数据库,该数据库将课程与课程参与者连接起来。该数据库的问题是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查询有效,因此问题出在哪里,我该如何解决?
编辑
蒂姆回答后,让我陷入了这个错误:
[HY000][1093] You can't specify target table 'courses' for update in FROM clause
答案 0 :(得分:2)
您的外部删除查询根本不与子查询相关,因此您在逻辑上不需要别名:
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
);
我不确定在单个表的delete语句中是否允许使用别名。允许他们进行删除联接,但是您不这样做。