SQL Server 重构SQL:移除EXCEPT语法,改用WHERE/AND条件实现等价逻辑
逻辑说明
原SQL中的EXCEPT是对#RowsIWant的Id做集合差集计算,最终保留的是#RowsIWant里不存在任何符合以下条件的关联PriceValues记录的Id:
- PriceValues.StartDate > @currentExpiryDate
- @newEndDate >= PriceValues.StartDate
这个差集逻辑可以直接用NOT EXISTS存在性判断等价替换,直接写在WHERE的AND条件中即可,不需要保留嵌套子查询。
正确改写SQL
UPDATE pv SET pv.EndDate = @newEndDate, pv.AuditUser = @auditUser FROM PriceValues pv INNER JOIN Prices p ON pv.PriceId = p.Id INNER JOIN #RowsIWant rw ON p.Id = rw.Id WHERE pv.EndDate = @currentExpiryDate AND p.Active = 1 -- 以下为替换EXCEPT的等价逻辑 AND NOT EXISTS ( SELECT 1 FROM PriceValues pv_inner WHERE pv_inner.PriceId = p.Id AND pv_inner.StartDate > @currentExpiryDate AND @newEndDate >= pv_inner.StartDate )
原有尝试版本的问题
你之前写的版本存在两个核心错误:
- 缺少
Prices表的关联,p.Active = 1没有对应的表来源,也缺失了PriceValues和Prices的关联校验规则 - 时间条件逻辑完全矛盾,你写的
pv.StartDate < @currentExpiryDate和@newEndDate <= pv.StartDate本身是互斥条件,不会有任何符合要求的行,而且这两个条件也完全无法替代EXCEPT的集合级排除逻辑 - EXCEPT是对Id维度的整体排除,不是对当前要更新的单条pv行的字段做过滤,所以不可能仅用单行列的大小比较实现等价效果,必须用存在性判断。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

