Oracle SQL中如何在两列上使用DISTINCT关键字实现各自去重?
解决两列各自独立去重的问题
我完全懂你的困扰——SELECT DISTINCT col001, col002确实达不到你想要的效果,因为DISTINCT是对整行的列组合去重,只有当col001和col002的值同时重复时,整行才会被过滤掉,这和你要的「两列各自独立去重」根本不是一回事。
最直接的解决方案:分开查询两列的去重值
如果只是想分别获取Col001和Col002的去重结果,最简单的方式就是执行两个独立的查询:
-- 获取Col001的所有唯一值 SELECT DISTINCT col001 FROM tbl1 WHERE col001 IS NOT NULL; -- 可选:过滤空值,根据你的实际数据需求调整
这个查询会返回你要的结果:555、7878、89
-- 获取Col002的所有唯一值 SELECT DISTINCT col002 FROM tbl1 WHERE col002 IS NOT NULL;
这个查询会返回:43、56、67、79
可选:在同一结果集中展示两列的去重值
如果需要把两个去重集合放在同一个结果表中展示(比如按行对齐),可以用CTE和窗口函数生成行号,再通过全外连接关联:
WITH unique_col001 AS ( -- 给Col001的唯一值添加行号 SELECT DISTINCT col001, ROW_NUMBER() OVER (ORDER BY col001) AS row_num FROM tbl1 WHERE col001 IS NOT NULL ), unique_col002 AS ( -- 给Col002的唯一值添加行号 SELECT DISTINCT col002, ROW_NUMBER() OVER (ORDER BY col002) AS row_num FROM tbl1 WHERE col002 IS NOT NULL ) -- 全外连接确保两个集合的所有值都能展示 SELECT uc1.col001, uc2.col002 FROM unique_col001 uc1 FULL OUTER JOIN unique_col002 uc2 ON uc1.row_num = uc2.row_num;
执行后会得到这样的结果:
| col001 | col002 |
|---|---|
| 555 | 43 |
| 7878 | 56 |
| 89 | 67 |
| NULL | 79 |
再明确下为什么原来的语句不行
当你用SELECT DISTINCT col001, col002时,数据库会把每一行的col001+col002组合当成一个整体去重。比如如果你的表中有两行是(555,43)和(555,43),这行会被去重,但如果是(555,43)和(555,56),这两行会被保留——因为它们的列组合不一样,这显然不是你想要的效果。
内容的提问来源于stack exchange,提问作者Arifullah
相关产品推荐
相关产品推荐

