微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除重复项的mysql语法错误

如何解决删除重复项的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

查询看起来不错。我在这里错过了什么?

解决方法

页面顶部的语法参考中的 documentation on DELETE 没有明确说明这一点,但如果您为表定义别名,则必须使用如下语法:

DELETE pmu1 FROM dmf_product_match_unmatches as pmu1
...

原因是使用 as 关键字会使解析器认为您使用的是多表删除语法,即使您在外部查询中只引用了一个表。我链接到的文档中的语法参考表明,如果您使用 table_references 语法,则需要 DELETE tbl_name FROM ... 语法,如果您使用 as 关键字,则需要这种语法。 >

文档确实有一个注释:

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

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

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

DELETE FROM dmf_product_match_unmatches
...
,

这是由于某些未知原因导致错误消息与错误不匹配的情况。我不明白为什么 - 在 CLI 中执行时,错误消息必须是

不能在 FROM 子句中指定目标表 'pmu1' 进行更新

错误的根源 - 您不能使用要更改的表作为 WHERE 中子查询的数据源。

您必须改用多表 DELETE 语法:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。