请求协助合并SQL查询:从test_run查询结果中排除指定folder_id数据
解决SQL查询排除特定folder_id记录的问题
我来帮你搞定这个问题!你之前用EXCEPT没达到预期效果的核心原因很明确:EXCEPT要求两个查询返回的列数、顺序和数据类型必须完全一致,你第一个查询返回了3列(d, r, f),但第二个查询只返回1列,两者根本无法匹配,所以逻辑上不成立。
下面给你三种可行的解决方案,都是针对你的需求专门设计的:
方案1:使用NOT IN子查询(最直观)
直接在主查询的WHERE条件里过滤掉需要排除的folder_id:
SELECT name AS d, test_run_id AS r, folder_id AS f FROM test_run WHERE folder_id NOT IN ( -- 保留你原本获取排除folder_id的子查询逻辑 SELECT folder_id FROM folder WHERE name IN ( SELECT column_value FROM TABLE (apex_string.split(config.get('ATM_DASHBOARD_CONFIGURATION_FOLDER_EXCLUDE'), ',')) ) );
这种写法逻辑清晰,先通过子查询拿到所有需要排除的文件夹ID,再在主查询中过滤掉这些ID对应的测试运行记录。
方案2:使用NOT EXISTS(处理NULL更安全)
如果你的folder表中可能存在folder_id为NULL的情况,NOT IN会出现意外结果(因为NULL的比较逻辑特殊),这时候NOT EXISTS是更稳妥的选择:
SELECT tr.name AS d, tr.test_run_id AS r, tr.folder_id AS f FROM test_run tr WHERE NOT EXISTS ( SELECT 1 FROM folder f -- 关联主查询的folder_id WHERE f.folder_id = tr.folder_id AND f.name IN ( SELECT column_value FROM TABLE (apex_string.split(config.get('ATM_DASHBOARD_CONFIGURATION_FOLDER_EXCLUDE'), ',')) ) );
NOT EXISTS会逐行检查主查询的记录,确认不存在满足排除条件的关联文件夹记录,避免了NULL值带来的问题。
方案3:使用LEFT JOIN + WHERE IS NULL(性能友好)
如果你的数据量较大,这种左连接的方式在某些数据库中性能会更优:
SELECT tr.name AS d, tr.test_run_id AS r, tr.folder_id AS f FROM test_run tr LEFT JOIN folder f ON tr.folder_id = f.folder_id -- 把排除条件放在JOIN的ON子句里 AND f.name IN ( SELECT column_value FROM TABLE (apex_string.split(config.get('ATM_DASHBOARD_CONFIGURATION_FOLDER_EXCLUDE'), ',')) ) -- 只保留没有匹配到排除文件夹的test_run记录 WHERE f.folder_id IS NULL;
这种方式通过左连接将test_run和需要排除的文件夹记录关联,然后筛选出没有匹配到的记录,也就是我们需要保留的内容。
内容的提问来源于stack exchange,提问作者Kalfja
相关产品推荐
相关产品推荐

