提问者:小点点

删除重复项时出现mysql语法错误


我正在尝试使用此查询删除具有重复的hid列值的行:

DELETE FROM dmf_product_match_unmatches as pmu1
WHERE ID not in 
(
    SELECT MAX(ID) as maxRecId
        FROM dmf_product_match_unmatches as pmu2
        GROUP BY hid       
);

但这给了

QL Error [1064] [42000]: 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 pmu1
WHERE ID not in 
(
    SELECT MAX(ID) as maxRecId
        FROM dmf_prod' at line 1

查询看起来很好。我错过了什么?


共2个答案

匿名用户

当错误消息由于某种未知原因与错误不匹配时,就会出现这种情况。我不明白为什么会这样--在CLI中执行时,错误消息必须是

不能在FROM子句中为update指定目标表“PMU1”

错误的根-不能将要更改的表用作WHERE中子查询的datasource。

您必须改用多表删除语法:

DELETE pmu1
FROM dmf_product_match_unmatches as pmu1
LEFT JOIN ( SELECT MAX(ID) as ID, hid
            FROM dmf_product_match_unmatches as pmu2
            GROUP BY hid) pmu3 USING (ID, hid)
WHERE pmu3.ID IS NULL;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=202CDDC698CDA3F83E0172C7E4E28A7D

匿名用户

关于DELETE的文档没有在页面顶部的语法引用中明确说明这一点,但如果您为表定义了别名,则必须使用如下语法:

DELETE pmu1 FROM dmf_product_match_unmatches as pmu1
...

原因是使用as关键字会使解析器认为您在使用多表删除语法,即使您在外部查询中只引用了一个表。我链接到的文档中的语法引用显示,如果使用table_references语法,则需要使用delete tbl_namefrom...语法,如果使用as关键字,则需要使用table_references语法。

文档下面确实有一个注释:

如果为表声明别名,则在引用表时必须使用该别名:

DELETE t1 FROM test AS t1, test2 WHERE ...

或者,您不需要在此查询中定义别名,因此可以使用更简单的语法:

DELETE FROM dmf_product_match_unmatches
...