当前位置: 首页 > 知识库问答 >
问题:

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

司寇灵均
2023-03-14

我正在尝试使用此查询删除具有重复的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个答案

闽涵蓄
2023-03-14

关于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
...
龙凯
2023-03-14

当错误消息由于某种未知原因与错误不匹配时,就会出现这种情况。我不明白为什么会这样--在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

 类似资料:
  • 问题内容: 我有这样的桌子 我想执行一个查询,以除去所有最新的重复项。我希望你有个主意吗? 例如,查询后的表必须是这样的 问题答案: 语法可能需要调整,但是应该做到这一点。此外,您可能希望将子查询预查询到其自己的表FIRST中,然后对该结果集运行DELETE FROM。

  • 请注意,在转向您之前,我已经浏览了各种帖子。事实上,我尝试实现中提供的解决方案:基于“notin”条件从数据帧中删除行 我的问题如下。让我们假设我有一个巨大的数据帧,我想删除重复的数据帧。我很清楚我可以使用drop_duplicates,因为这是最快的最简单的方法。然而,我们的老师希望我们创建一个包含重复项ID的列表,然后根据这些值是否包含在上述列表中删除它们。 现在,让我们看看输出: 因此,我得

  • 实际上,在按下一个按钮后,我有一个方法可以检查itemStorico ArrayList中是否存在从itemModel添加的新项,然后如果该项存在于名为itemModel的新列表中,我将从itemStorico中删除旧项并添加新项,否则只添加新项而不删除旧项。 但我得到以下错误: 下面是我的方法中的代码:

  • 我试图将一个表从一个数据库导入到另一个数据库,但是一直出现以下错误 命令: 错误: 错误1064(42000):SQL语法中有错误;检查与您的MySQL server版本相对应的手册,以确定在第1行使用“integer),latitude,longitude,latest_seen,last_scanned FROM rocketmapdb.spawnp'附近的语法是否正确 sql版本:mysql

  • 问题内容: 我在Docker容器中有一个MySQL数据库。入口点执行创建数据库的脚本和创建表的脚本。 除了一张桌子,其他所有东西都工作正常。 记录到控制台的错误是 第150行是后面的开括号 MySQL版本:8.0.3-rc-log 主机操作系统:Debian jessie 我开始考虑并且可能是保留关键字,因此我重命名了表和列,但错误仍然存​​在。 问题答案: @Bill Karwin在第一条评论中

  • 问题内容: 如何从以以下方式设置的表中删除重复项? 一个工作人员可以有多个与他们相关联的type_ID,我想删除所有重复的类型。如果有重复项,我想删除具有最新条目的类型。 问题答案: 窗口函数row_number()的教科书候选: 这也照顾了一组相同的受骗者的情况。 请参阅有关data.SE的简化演示。 更新较简单的版本 事实证明,这可以简化:在SQL Server中,您可以直接从CTE中删除: