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

能否在嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:57:04