Oracle SQL查询结果过滤求助:多SUBTEST关联数据集筛选需求
Oracle SQL 查询结果过滤方案
嗨,我来帮你梳理下针对这个Oracle SQL查询结果的过滤方案,先把你的背景信息整理清楚:
你的原始查询(修正了语法小问题)
SELECT TABLE1.TEST, TABLE2.SUB_TEST, TABLE3.RUN_NAME FROM TABLE1, TABLE2, TABLE3, TABLE4 WHERE -- 这里是你写的若干LIKE检索条件
当前返回的结果示例
| TEST | SUB_TEST | RUN_NAME |
|---|---|---|
| TEST1 | SUBTEST1 | 49_4021 |
| TEST1 | SUBTEST2 | 49_4021 |
| TEST1 | SUBTEST1 | 49_4033 |
| TEST1 | SUBTEST2 | 49_4033 |
| TEST2 | SUBTEST1 | 50_2122 |
| TEST2 | SUBTEST2 | 50_2122 |
已知每个TEST都对应2个及以上SUB_TEST,下面针对几种常见的过滤需求给你具体实现方案:
场景1:只保留完整包含某TEST所有SUBTEST的RUN_NAME记录
比如你想确保,只有当某个RUN_NAME下,对应TEST的所有子测试都存在时,才保留这个RUN_NAME的所有记录。可以用分组统计来验证完整性:
WITH original_results AS ( SELECT TABLE1.TEST, TABLE2.SUB_TEST, TABLE3.RUN_NAME FROM TABLE1, TABLE2, TABLE3, TABLE4 WHERE -- 你的LIKE过滤条件 ) SELECT r.* FROM original_results r JOIN ( SELECT TEST, RUN_NAME FROM original_results GROUP BY TEST, RUN_NAME -- 统计当前RUN_NAME下该TEST的SUB_TEST数量,和该TEST的总SUB_TEST数对比 HAVING COUNT(DISTINCT SUB_TEST) = ( SELECT COUNT(DISTINCT SUB_TEST) FROM original_results r2 WHERE r2.TEST = r.TEST ) ) valid_runs ON r.TEST = valid_runs.TEST AND r.RUN_NAME = valid_runs.RUN_NAME;
场景2:筛选特定SUB_TEST的记录
如果只是想保留某个特定的子测试(比如只看SUBTEST1),直接在WHERE条件里加过滤即可:
SELECT TABLE1.TEST, TABLE2.SUB_TEST, TABLE3.RUN_NAME FROM TABLE1, TABLE2, TABLE3, TABLE4 WHERE -- 你的LIKE过滤条件 AND TABLE2.SUB_TEST = 'SUBTEST1';
要是想排除某个子测试,把=换成<>就好。
场景3:去除重复的记录
如果你的结果里有重复的TEST+SUB_TEST+RUN_NAME组合,想只保留一条,用DISTINCT最简单:
SELECT DISTINCT TABLE1.TEST, TABLE2.SUB_TEST, TABLE3.RUN_NAME FROM TABLE1, TABLE2, TABLE3, TABLE4 WHERE -- 你的LIKE过滤条件;
如果需要更精准的去重(比如基于某个表的主键来保留最新/最早的记录),可以用窗口函数ROW_NUMBER():
WITH original_results AS ( SELECT TABLE1.TEST, TABLE2.SUB_TEST, TABLE3.RUN_NAME, -- 按组合分组,给每组记录编号 ROW_NUMBER() OVER (PARTITION BY TABLE1.TEST, TABLE2.SUB_TEST, TABLE3.RUN_NAME ORDER BY TABLE1.TEST) AS rn FROM TABLE1, TABLE2, TABLE3, TABLE4 WHERE -- 你的LIKE过滤条件 ) SELECT TEST, SUB_TEST, RUN_NAME FROM original_results WHERE rn = 1; -- 只保留每组的第一条
如果你的过滤需求不是上面这些,可以具体说说你想要保留/排除哪些记录,我再帮你调整方案~
内容的提问来源于stack exchange,提问作者pts2800
相关产品推荐
相关产品推荐

