SQL查找没有重复列值的行

时间:2014-10-28 15:46:18

标签: sql oracle oracle10g

我有一个查询

select * from circuit where y ='b';

我得到以下结果

x       |  location_a  | location_b  | y  
-----------------------------------------
1232    |     mexico   |  usa        | b
1232    |     mexico   |  usa        | b
1232    |     brasil   |  usa        | b
9999    |     brasil   |  usa        | b

我需要找出没有重复location_a和location_b的x。在这种情况下,必须打印以下数据。

1232    |     brasil   |  usa        | b
9999    |     brasil   |  usa        | b

我正在使用Oracle 10g。如果可能,请告诉我。 (distinct / group by将删除重复但仍将保留我不需要的一行)

2 个答案:

答案 0 :(得分:2)

您可以使用group by并删除重复的添加条件:having count(*) = 1

select x, location_a, location_b
 from circuit
 where y ='b'
 group by x, location_a, location_b
 having count(*) = 1

答案 1 :(得分:1)

您可以使用分析函数来计算匹配项,然后过滤:

select x, location_a, location_b, y
from (select c.*,
             count(*) over (partition by x, location_a, location_b) as cnt
      from circuit
     ) c
where cnt = 1;

编辑:

over子句引入了分析函数。要真正理解它们,您可以从文档开始(参见here)。这个特定函数的作用是为结果集中的每一行赋值。该值是xlocation_alocation_b与所讨论的行具有相同值的行数。对于您的数据,它将分配:

x       |  location_a  | location_b  | y  | cnt 
-----------------------------------------------
1232    |     mexico   |  usa        | b  |  2
1232    |     mexico   |  usa        | b  |  2
1232    |     brasil   |  usa        | b  |  1
9999    |     brasil   |  usa        | b  |  1

前两行有一个" 2"因为有两行1232 / mexico / usa。最后两个有1,因为他们的三元组是唯一的。