在Oracle中使用DISTINCT

时间:2018-09-01 07:56:20

标签: sql oracle distinct

为什么我的查询仍显示重复的元组? 我想要所有不同元组的所有属性

select distinct * from employees;

4 个答案:

答案 0 :(得分:3)

我认为您的方法涉及 NULL值空字符串可能是问题的原因:

create table tab( id int, value varchar2(75));
insert into tab values(1,'  ');
insert into tab values(1,' ');
insert into tab values(1,'');
insert into tab values(1,null);

select distinct * from tab;
ID  VALUE
--  -----
1   
1   
1   (null)

select id, length(value) as value from tab;
ID  VALUE
--  -----
1   2   
1   1
1   (null)
1   (null)

Oracle认为''NULL,但 length> = 1 的空字符串不视为NULL。 / p>

SQL Fiddle Demo

答案 1 :(得分:0)

如果您需要一个元组所有不同的结果,则不应使用*(所有列),而应仅为元组中涉及的列明确选择

select distinct col1, col2, col3 from employees;

通常使用所有列选择器(*),还从表中选择通常(根据定义)不重复的主键,因此使用select * ...  您将获得表中的所有行。

答案 2 :(得分:0)

如果您的列中有一些“”,则会发现重复,因为

Value1值2“”不是
Value1值2“”也不
value1 value2 NULL

此外,PrimaryKey始终是唯一的,因此
选择不同的*,是唯一
通常,如果您需要在表员工中“选择唯一”,则会出现概念问题,因为每个员工只应出现一次(如果它是真正的表员工而没有链接)

答案 3 :(得分:0)

要在导入期间解决此问题,您必须从字符串末尾修剪空格,这应照顾到这3个不同的字符。请注意,LTRIM和RTRIM仅删除了“空白”,在文档中进一步说明建议仅考虑空格。因此,您将不得不使用其他修整功能(例如您正在使用的编程语言)来进行修整。