我正在尝试使用此查询删除具有重复的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
查询看起来很好。我错过了什么?
当错误消息由于某种未知原因与错误不匹配时,就会出现这种情况。我不明白为什么会这样--在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
...