SQL查询条件逻辑错误排查:正确过滤工单数据
问题分析与解决方案
场景与需求
现有工单数据表,包含Customer、Job字段(Customer名称唯一,Job可跨客户重复),原始数据如下:
- Customer 1, Job 1
- Customer 1, Job 2
- Customer 1, Job 3
- Customer 2, Job 1
- Customer 2, Job 2
- Customer 2, Job 3
- Customer 3, Job 1
- Customer 3, Job 2
- Customer 3, Job 3
需要实现:排除Customer 1的所有工单,同时排除Customer 2的Job 1工单,保留其余所有数据。
原查询的问题
原执行的SQL逻辑错误:
Select * from Table Where Customer <> 'Customer 1' AND (Customer <> 'Customer 2' AND Job <> 'Job 1')
括号内的Customer <> 'Customer 2' AND Job <> 'Job 1'会过滤掉所有Customer 2的记录(因为只要Customer是2,Customer <> 'Customer 2'就不成立,整个括号条件为假),导致最终仅返回Customer 3的Job 2、Job 3数据,不符合预期。
正确SQL写法
写法一:明确排除特定组合
SELECT * FROM Table WHERE Customer <> 'Customer 1' AND NOT (Customer = 'Customer 2' AND Job = 'Job 1')
逻辑说明:先排除所有Customer 1的记录,再排除Customer 2且Job 1的特定工单,精准保留所需数据。
写法二:拆分条件使用OR
SELECT * FROM Table WHERE Customer <> 'Customer 1' AND (Customer <> 'Customer 2' OR Job <> 'Job 1')
逻辑说明:只要不是Customer 1,同时满足「不是Customer 2」或者「是Customer 2但Job不是1」,和写法一等价。
预期结果
两种写法均会返回以下数据:
- Customer 2, Job 2
- Customer 2, Job 3
- Customer 3, Job 1
- Customer 3, Job 2
- Customer 3, Job 3
内容的提问来源于stack exchange,提问作者db_at_systems
相关产品推荐
相关产品推荐

