如何通过WHERE子句结合多表存在性检查返回目标数据
调整SQL查询的WHERE子句以满足过滤需求
修改后的完整查询
SELECT p.id, sp.Cohort, sp.programID, sp.Inactive FROM dbo.people p INNER JOIN dbo.Programs sp ON p.id = sp.id INNER JOIN dbo.type ctp ON sp.typeid = ctp.programid LEFT JOIN dbo.address ppa ON p.id = ppa.id -- 新增左连接关联table2,用于判断用户是否在豁免列表中 LEFT JOIN dbo.table2 t2 ON p.id = t2.userid WHERE ctp.typeid = 'AType' AND sp.Cohort = 2023 -- 替换原有的Inactive过滤条件,组合两个核心判断 AND ( sp.Inactive = 'N' OR t2.userid IS NOT NULL ) ORDER BY p.id
逻辑说明
- 关联豁免表:通过
LEFT JOIN关联存储豁免用户的table2,以此判断当前用户是否属于无需检查Inactive状态的群体 - 过滤条件组合:
- 保留所有
sp.Inactive = 'N'的记录(对应需求第一条) - 同时保留所有在
table2中存在的用户记录,无论其sp.Inactive是Y还是N(对应需求第二条) - 自动排除
sp.Inactive = 'Y'且不在table2中的记录(对应需求第三条)
- 保留所有
对应示例验证
针对你给出的示例数据:
- userid 1:
Inactive='N',满足第一个条件,被返回 - userid 2:
Inactive='Y'但存在于table2,满足第二个条件,被返回 - userid 3:
Inactive='N',满足第一个条件,被返回 - userid 4:
Inactive='Y'且不在table2,两个条件都不满足,被排除
内容的提问来源于stack exchange,提问作者ghostfly
相关产品推荐
相关产品推荐

