You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无ID列时删除Oracle表重复行遇ORA-00913错误求助

解决ORA-00913错误并删除重复行

错误原因

你的DELETE语句触发ORA-00913是因为子查询返回了3个字段(MAX(rowid)、po_number、item_number),但rowid NOT IN (...)要求子查询只能返回单个列的结果,多列值无法匹配rowid这个单一字段,导致参数数量不匹配。

修正方案1:调整子查询返回单一列

保留每组中rowid最大的行,删除其余重复记录:

DELETE shipment_item
 WHERE rowid NOT IN (
                     SELECT MAX(rowid)
                       FROM shipment_item
                      GROUP BY po_number, item_number
                    )

说明:去掉子查询里多余的po_number和item_number,只返回分组后的最大rowid。不需要HAVING COUNT(*) >1,因为无重复的分组中MAX(rowid)就是行本身,不会被删除。

修正方案2:使用窗口函数(更直观)

通过ROW_NUMBER()给每个分组内的行编号,删除编号大于1的重复行:

DELETE FROM shipment_item
 WHERE rowid IN (
                  SELECT rid
                    FROM (
                           SELECT rowid AS rid,
                                  ROW_NUMBER() OVER (PARTITION BY po_number, item_number ORDER BY rowid) AS rn
                             FROM shipment_item
                         )
                   WHERE rn > 1
                )

说明:PARTITION BY po_number, item_number按重复字段分组,ORDER BY rowid确定保留哪一行(这里保留最早的行,若要保留最新的可改为ORDER BY rowid DESC),rn >1标记重复行,最后删除这些行。

内容的提问来源于stack exchange,提问作者CaptainGenesisX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:47:02