多条件WHERE语句优化:排除特定记录的SQL逻辑改写求助
改写后的SQL逻辑
原逻辑用OR连接三个条件会导致只要符合第一个子句就被返回,完全没起到排除后两个子句的作用。正确的逻辑应该是:先匹配第一个子句的所有基础条件,同时排除符合后两个子句任意一条的记录。
简化后的SQL WHERE子句
WHERE -- 基础匹配条件(原第一个子句的全部规则) o.ord_billto = 'CATGRI' AND o.ord_status = 'CMP' AND o.ord_startdate >= @StartDate AND o.ord_startdate < @EndDate + 1 AND o.ord_invoicestatus = 'XIN' -- 排除符合后两个子句的记录 AND NOT ( -- 原第二个子句的专属条件 (o.ord_revtype4 IN ('GRIFF3') AND s.cmp_id NOT IN ('CATLAF10','ORDBEL', 'SKYLIV','SKYPLY')) -- 或原第三个子句的专属条件 OR (o.ord_revtype4 IN ('GRIFF1') AND s.cmp_id NOT IN ('CATGRI02','CATWAC01')) )
逻辑说明
- 先锁定所有符合基础过滤规则的记录,避免重复写相同条件
- 通过
NOT (...)包裹后两个子句的OR逻辑,确保只要符合后两个子句中任意一条的记录都被排除 - 结构更清晰,后续维护时只需修改对应区块的条件即可
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

