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

SQL Server中CTE用COUNT窗口函数执行删除时报4403错误的原因

报错原因

SQL Server 对可更新CTE有严格限制:要求CTE返回的每一行必须和底层原表的行是一一对应的关系,数据库才能将对CTE的删除操作映射到原表的对应记录。
你的CTE中使用了DISTINCT去重,还使用了窗口聚合函数COUNT(*) OVER()做聚合计算,已经破坏了这种一一映射关系,所以无法直接对这个CTE执行删除操作,和窗口函数本身的使用没有直接关联,报错提示里的描述也明确说明了这个限制。

正确实现方案

你要删除id对应的条目数不等于31的所有记录,可以用下面两种写法实现:

方案1:通过分组先筛选出要删除的id

WITH IdToDelete AS
(
    SELECT id
    FROM dailyActivity_merged$
    GROUP BY id
    HAVING COUNT(*) <> 31
)
DELETE FROM dailyActivity_merged$
WHERE id IN (SELECT id FROM IdToDelete)

方案2:将窗口函数计算结果关联回原表删除

DELETE t
FROM dailyActivity_merged$ t
JOIN (
    SELECT 
        id,
        COUNT(*) OVER (PARTITION BY id) AS ctn
    FROM dailyActivity_merged$
) AS cnt_table ON t.id = cnt_table.id
WHERE cnt_table.ctn <> 31

内容的提问来源于stack exchange,提问作者Emil-Constantin BUCUR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:06:04