如何使用子查询进行两次过滤?SQL矛盾约束数据筛选需求
实现两次过滤的子查询方案
嘿,我来帮你调整这个查询,完美实现你要的两次过滤需求!你的目标是先筛出sproject_number为NULL的记录,再从这个结果里挑出status_desc等于'90-Lost Opportunity'的条目对吧?
子查询分两次过滤的写法
你可以给子查询加个别名,然后在外层查询里添加第二次过滤的条件,这样就严格按照“先筛选空值,再筛选状态”的逻辑执行了:
SELECT ProjectNumber, PName FROM ( -- 第一次过滤:仅保留sproject_number为NULL的记录 SELECT DISTINCT T0.project_number_ext AS ProjectNumber, T0.project_key AS PKey, T0.sproject_number AS sPNumber, T0.project_number AS PNumber, T0.schedule_finish AS SFinish, T0.status_desc AS SDesc, T0.Project_name AS PName FROM trimergo.rpt_getProjectPOC T0 WHERE T0.sproject_number IS NULL ) AS FilteredNulls -- 给子查询起个别名,方便外层引用 -- 第二次过滤:从空值结果里筛选目标状态 WHERE FilteredNulls.SDesc = '90-Lost Opportunity' GROUP BY ProjectNumber, PName;
简化版(等价逻辑,性能更优)
其实如果不需要保留中间字段(比如PKey、SFinish这些),你也可以把两个过滤条件合并到一次查询里,逻辑完全一致,而且数据库能更高效地执行:
SELECT DISTINCT T0.project_number_ext AS ProjectNumber, T0.Project_name AS PName FROM trimergo.rpt_getProjectPOC T0 WHERE T0.sproject_number IS NULL AND T0.status_desc = '90-Lost Opportunity' GROUP BY ProjectNumber, PName;
这里补充个小细节:你的原查询里同时用了DISTINCT和GROUP BY,如果ProjectNumber和PName是一一对应的关系,其实选其中一个就足够去重了,不过保留两者也不会有问题。
内容的提问来源于stack exchange,提问作者Anirban
相关产品推荐
相关产品推荐

