SQL Server 2008如何编写带GROUP BY的DELETE删除语句
解决方案
你遇到的两个报错都属于SQL Server DML语法的常规限制,直接通过主键匹配或者EXISTS判断就能实现需求,不需要临时表:
报错原因说明
- 带
GROUP BY的DELETE语句报错:SQL Server的DELETE语法原生不支持GROUP BY子句,GROUP BY仅用于SELECT聚合场景,删除操作无需对匹配结果分组。 - 子查询删除报错:你的子查询关联了多张表,SQL Server无法判定你要删除子查询涉及的哪个基表的数据,因此抛出
视图或函数不可更新的错误。
方案1:IN子查询匹配主键
由于Apples.ID是主键,直接将你原查询得到的唯一ID列表作为IN的匹配条件即可:
DELETE FROM Apples WHERE ID IN ( SELECT Apples.ID FROM Apples LEFT JOIN Table_B tb ON Apples.ID = tb.Apples_ID LEFT JOIN Table_C tc ON tb.xID = tc.xID LEFT JOIN Pips p ON tb.Apples_ID = p.Apples_ID WHERE tc.X IS NULL GROUP BY Apples.ID )
你也可以把GROUP BY换成DISTINCT,二者在这里的去重效果完全一致。
方案2:EXISTS判断(性能更优)
如果数据量较大,更推荐用EXISTS写法,不需要做去重操作,匹配到符合条件的记录就会终止判断,执行效率更高:
DELETE a FROM Apples a WHERE EXISTS ( SELECT 1 FROM Table_B tb LEFT JOIN Table_C tc ON tb.xID = tc.xID -- 若原逻辑需要Pips表的关联过滤,在这里加LEFT JOIN Pips的逻辑即可 WHERE tb.Apples_ID = a.ID AND tc.X IS NULL )
内容的提问来源于stack exchange,提问作者mikec
相关产品推荐
相关产品推荐

