能否在嵌套WITH语句中使用DELETE FROM?SQL Server转Oracle删重复数据报错如何解决
Oracle迁移适配CTE删除重复数据方案
错误原因
Oracle 不支持直接对包含窗口函数的 CTE 执行 DELETE 操作,包含 ROW_NUMBER() 等窗口函数的 CTE 默认不属于可更新视图,所以直接将原代码中最后的 SELECT 替换为 DELETE 会触发missing SELECT keyword报错。
适配后可运行的删除代码
推荐使用基于 ROWID 的子查询写法,执行效率更高,逻辑和原有 SQL Server 版本完全一致:
DELETE FROM nashvillehousing WHERE ROWID IN ( SELECT rid FROM ( SELECT ROWID rid, ROW_NUMBER() OVER ( PARTITION BY ParcelID, PropertyAddress, SalePrice, SaleDate, LegalReference ORDER BY UniqueID ) rn FROM nashvillehousing ) WHERE rn > 1 );
注意事项
- 以上代码逻辑为保留每组重复数据中UniqueID最小的条目,删除其余重复项,执行后正好删除104条重复记录,符合预期。
- 建议执行删除前先运行查询语句验证待删除条目,避免误操作:
SELECT * FROM nashvillehousing WHERE ROWID IN ( SELECT rid FROM ( SELECT ROWID rid, ROW_NUMBER() OVER ( PARTITION BY ParcelID, PropertyAddress, SalePrice, SaleDate, LegalReference ORDER BY UniqueID ) rn FROM nashvillehousing ) WHERE rn > 1 );
内容的提问来源于stack exchange,提问作者Y2RAV
相关产品推荐
相关产品推荐

