Snowflake SQL查询时如何仅移除同时满足两个指定条件的记录
问题根因
你编写的WHERE子句使用AND连接两个NOT IN判断,实际表达的逻辑是:同时满足「薪资代码不是SUPA」和「岗位ID不是0000087544」两个条件的记录才会被保留,相当于直接排除了所有岗位ID为0000087544的记录、以及所有薪资代码为SUPA的记录,和你要的「仅移除同时满足两个条件的记录」需求完全不符。
解决方案
不需要使用JOIN或者子查询,直接调整WHERE条件的布尔逻辑即可实现需求,核心是把要排除的组合条件放到NOT修饰的括号内:
SELECT * FROM timesheets WHERE NOT (position_id = '0000087544' AND external_payroll_code = 'SUPA');
逻辑验证
对应你给出的示例输入:
- 员工1A的记录同时满足
position_id = '0000087544'和external_payroll_code = 'SUPA',会被NOT修饰后排除 - 员工1B的记录仅满足薪资代码为SUPA,不满足岗位ID条件,会被保留
最终输出完全符合你的预期。
如果要兼容字段为NULL的场景,也可以调整为NVL或者IS NOT DISTINCT FROM的写法,以上基础写法已经可以覆盖绝大多数正常考勤数据的过滤场景。
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

