我有一个查询
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将删除重复但仍将保留我不需要的一行)
答案 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)。这个特定函数的作用是为结果集中的每一行赋值。该值是x
,location_a
和location_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,因为他们的三元组是唯一的。