Oracle SQL如何排除查询结果中INSTANCE和LOGNUMBER相同的多行数据
Oracle SQL成对重复行过滤方案
核心逻辑是统计INSTANCE和LOGNUMBER组合的出现次数,仅保留出现次数为1的组合对应的行即可,完全不需要依赖DATAFLAG字段判断,不会漏删匹配行。
实现1:窗口分析函数(推荐,性能最优)
仅扫描一次全表,适合大数据量场景:
SELECT SEQUENCE, INSTANCE, NAME, LOGNUMBER, DATAFLAG FROM ( SELECT t.*, COUNT(*) OVER(PARTITION BY INSTANCE, LOGNUMBER) AS group_cnt FROM datatable t ) WHERE group_cnt = 1 ORDER BY SEQUENCE;
逻辑说明
- 用
COUNT(*) OVER(PARTITION BY INSTANCE, LOGNUMBER)统计每个(INSTANCE, LOGNUMBER)组合的行数 - 成对的组合行数为2,会被
WHERE group_cnt = 1过滤,仅保留无匹配的独立行 - 最终输出和你要求的期望结果完全一致
实现2:EXISTS子查询写法
适合习惯用关联逻辑的场景:
SELECT t1.* FROM datatable t1 WHERE NOT EXISTS ( SELECT 1 FROM datatable t2 WHERE t2.INSTANCE = t1.INSTANCE AND t2.LOGNUMBER = t1.LOGNUMBER AND t2.SEQUENCE != t1.SEQUENCE ) ORDER BY t1.SEQUENCE;
逻辑说明
- 逐行判断是否存在同
INSTANCE、同LOGNUMBER的其他行 - 不存在匹配行的记录才会被保留,过滤效果和第一种写法完全一致
内容的提问来源于stack exchange,提问作者Kowl
相关产品推荐
相关产品推荐

