You need to enable JavaScript to run this app. PostgreSQL使用CTE删除重复行时报关系错误无法删除怎么办
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL使用CTE删除重复行时报关系错误无法删除怎么办

错误原因

PostgreSQL 中的普通 CTE(通用表表达式)属于只读临时结果集,本质是临时视图而非物理存储的关系表,因此不支持直接对 CTE 执行 DELETE、UPDATE 等写操作。你当前的语法兼容 SQL Server 等支持可更新 CTE 的数据库,但 PostgreSQL 不支持该写法,执行 DELETE 时会因为无法将 CTE 识别为可写的物理关系抛出对应错误。

解决方案

你可以通过将 CTE 中筛选出的重复行 ID 关联到原 housing 表执行删除,核心逻辑是通过唯一主键 unique_id 定位到需要删除的原表行,参考代码如下:

WITH RowNumCTE AS (
    SELECT unique_id, 
        ROW_NUMBER() OVER(
            PARTITION BY parcelid, property_address, saleprice, saledate, legal_ref
            ORDER BY unique_id
        ) AS row_num
    FROM housing
)
DELETE FROM housing
WHERE unique_id IN (
    SELECT unique_id FROM RowNumCTE WHERE row_num > 1
);

如果不想用 CTE 也可以用自关联写法实现相同去重逻辑:

DELETE FROM housing a
USING housing b
WHERE 
    a.parcelid = b.parcelid
    AND a.property_address = b.property_address
    AND a.saleprice = b.saleprice
    AND a.saledate = b.saledate
    AND a.legal_ref = b.legal_ref
    AND a.unique_id > b.unique_id;

注意:执行删除操作前建议先替换 DELETE 为 SELECT * 验证筛选出的待删除行符合预期,避免误删数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 07:15:01