【问题标题】:Getting around MySql Error 1093 with a NOT IN Subquery使用 NOT IN 子查询绕过 MySql 错误 1093
【发布时间】:2025-12-08 14:15:02
【问题描述】:

如何通过以下查询完成我想要完成的任务?

DELETE SomeDB.outertable 
FROM SomeDB.logging AS outertable
WHERE outertable.log_id NOT IN
    (
    SELECT SomeDB.f.log_id
    FROM
        (
        SELECT aa.*, MAX(aa.log_id) AS max_log_id
        FROM SomeDB.logging AS aa
        WHERE aa.operation_status = -1
        GROUP BY aa.process_id

        UNION ALL
        SELECT bb.*, MAX(bb.log_id) AS max_log_id
        FROM SomeDB.logging AS bb
        WHERE bb.operation_status = 1
        GROUP BY bb.process_id

        UNION ALL
        SELECT cc.*, MAX(cc.log_id) AS max_log_id
        FROM SomeDB.logging AS cc
        WHERE cc.operation_status = 0
        GROUP BY cc.process_id
        )
    AS x
    INNER JOIN SomeDB.logging AS f
        ON f.process_id = x.process_id
        AND f.log_id = x.max_log_id
    )

根据对网络的一些研究,我已经尝试了几种变体,但我总是收到以下错误:

错误代码:1093 您不能在 FROM 子句中指定目标表 'outertable' 进行更新

编辑:我正在尝试通过删除每个进程的每种类型的最后一条记录之外的所有记录来清理事件记录表。

【问题讨论】:

    标签: mysql sql greatest-n-per-group mysql-error-1093


    【解决方案1】:

    从您的查询中删除 SomeDB.outertable 以便它开始

    DELETE FROM SomeDB.logging AS outertable
    

    【讨论】:

    • 谢谢,我以前试过那个。它导致错误代码:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 'AS outertable WHERE outertable.log_id NOT IN ( SELECT SomeDB.f.log_id ' 附近使用正确的语法
    • 删除AS 子句,它不是删除语法的一部分。 - dev.mysql.com/doc/refman/5.0/en/delete.html
    • 这让我回到错误 1093。另外,ASDELETE 语法的一部分 - 更仔细地检查文档。它包含在JOIN 语法中的table_references 下,在DELETE 语法页面上引用了该语法。见:dev.mysql.com/doc/refman/5.0/en/join.html
    • 您没有加入DELETE,而是加入了子SELECT。当您只运行子查询时会发生什么?
    • AS 允许在 DELETE 查询中使用,无论我是否按照您提供的链接文档中对 table_references 的引用加入它。 AS 在我提供的原始示例中有效 - 没有抛出语法错误,查询执行大约一分钟,然后因 1039 错误而死,这与语法问题完全不同。单独的子查询按预期工作 - 它准确返回我不想删除的记录。