You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中如何筛选唯一行并排除存在不同值的重复记录?

修复Oracle查询以获取符合要求的唯一记录

首先得指出你原查询里的几个关键问题:

  • 你把number和name列搞混了!子查询里写的WHERE number IN ('Mel','Jose','Kim'),但这些明显是name列的值,应该改成WHERE name IN ('Mel','Jose','Kim')。
  • 原查询的分组逻辑不对:GROUP BY number却直接SELECT name,这在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:57:40