如何编写SQL查询筛选无COSTS报告码的项目信息
解决方案
要提取所有未包含report_code为"COSTS"的项目信息,核心是筛选出整个PROJECT_ID下完全没有COSTS类型记录的所有关联行,以下是几种高效的实现方式:
方法1:使用NOT EXISTS子查询
这是直观且性能表现较好的写法,逐行检查当前项目是否存在COSTS记录:
SELECT t1.* FROM Table_1 t1 WHERE NOT EXISTS ( SELECT 1 FROM Table_1 t2 WHERE t2.PROJECT_ID = t1.PROJECT_ID AND t2.report_code = 'COSTS' );
方法2:GROUP BY + HAVING筛选合法项目ID
先通过分组统计找出符合条件的PROJECT_ID,再关联原表获取所有记录:
SELECT t1.* FROM Table_1 t1 JOIN ( SELECT PROJECT_ID FROM Table_1 GROUP BY PROJECT_ID HAVING SUM(CASE WHEN report_code = 'COSTS' THEN 1 ELSE 0 END) = 0 ) valid_projects ON t1.PROJECT_ID = valid_projects.PROJECT_ID;
这里用CASE表达式统计每个项目下COSTS的数量,等于0则说明该项目无COSTS记录。
方法3:LEFT JOIN筛选未匹配项
通过左连接自身并筛选未关联到COSTS记录的行:
SELECT t1.* FROM Table_1 t1 LEFT JOIN Table_1 t2 ON t1.PROJECT_ID = t2.PROJECT_ID AND t2.report_code = 'COSTS' WHERE t2.PROJECT_ID IS NULL;
如果某个项目存在COSTS记录,左连接后t2会有对应数据,否则t2的字段为NULL,以此筛选目标行。
内容的提问来源于stack exchange,提问作者user1305070
相关产品推荐
相关产品推荐

