Oracle中如何筛选唯一行并排除存在不同值的重复记录?
修复Oracle查询以获取符合要求的唯一记录
首先得指出你原查询里的几个关键问题:
- 你把
number和name列搞混了!子查询里写的WHERE number IN ('Mel','Jose','Kim'),但这些明显是name列的值,应该改成WHERE name IN ('Mel','Jose','Kim')。 - 原查询的分组逻辑不对:
GROUP BY number却直接SELECTname,这在Oracle里会触发语法错误(除非你开了宽松分组模式,但逻辑也不对),而且你用COUNT(*) =1是统计该number的行数,不是统计该number对应的不同name数量,这完全不符合你的需求。
你的核心需求是:筛选出name只对应唯一number,且number也只对应唯一name的记录,同时每个符合条件的(number, name)组合只显示一次。下面给你两种可行的实现方法:
方法一:用分析函数(推荐,性能更优)
分析函数可以一次性计算出每个name对应的不同number数量,以及每个number对应的不同name数量,再筛选符合条件的记录:
SELECT DISTINCT number, name FROM ( SELECT number, name, -- 统计每个name对应的不同number数量 COUNT(DISTINCT number) OVER (PARTITION BY name) AS name_unique_num_count, -- 统计每个number对应的不同name数量 COUNT(DISTINCT name) OVER (PARTITION BY number) AS num_unique_name_count FROM your_table -- 替换成你的实际表名 WHERE name IN ('Mel','Jose','Kim') ) filtered -- 只保留name仅对应一个number,且number仅对应一个name的记录 WHERE name_unique_num_count = 1 AND num_unique_name_count = 1;
方法二:用GROUP BY + 子查询
如果你更习惯用传统的分组查询,也可以这样写:
SELECT number, name FROM your_table WHERE name IN ('Mel','Jose','Kim') -- 确保该number只有一个对应的name AND number IN ( SELECT number FROM your_table WHERE name IN ('Mel','Jose','Kim') GROUP BY number HAVING COUNT(DISTINCT name) = 1 ) -- 确保该name只有一个对应的number AND name IN ( SELECT name FROM your_table WHERE name IN ('Mel','Jose','Kim') GROUP BY name HAVING COUNT(DISTINCT number) = 1 ) -- 去重,避免同一(number,name)组合出现多行 GROUP BY number, name;
这两种方法都能得到你想要的结果:
number name aaa Mel zzz Kim
内容的提问来源于stack exchange,提问作者debegris
相关产品推荐
相关产品推荐

