无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
相关产品推荐
相关产品推荐

