从子查询中删除多行的SQL语法错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从子查询中删除多行的SQL语法错误相关的知识,希望对你有一定的参考价值。

我有一个使用InnoDB的关系mysql数据库,它将课程连接到课程参加者。此数据库的问题是course_id中的course_attendees列未设置为外键。 course_attendees表试图引用的地方有很多课程缺失。

我想删除这些记录,因为这些课程不再属于。我编写了这个select查询,它选择了应该删除的所有课程:

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
答案

您的外部删除查询根本不与子查询相关联,因此您在逻辑上不需要别名:

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

我不确定只在一个表上的删除语句中是否允许使用别名。它们被允许进行删除连接,但你没有这样做。

以上是关于从子查询中删除多行的SQL语法错误的主要内容,如果未能解决你的问题,请参考以下文章

从子查询中获取表名以在一行中用于 Oracle 中的删除/更新/插入子句

SQL/Regex Challenge/Puzzle:如何从 SQL 代码中删除注释(通过使用 SQL 查询)?

SQL 中删除语法的问题 - 当子查询没有与 EXISTS 一起引入时,错误只能在选择列表中指定一个表达式

PL/SQL的基本语法

使用 SQLKorma 获取语法异常:使用 SQL 执行查询失败

sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果