2014-10-28 27 views
0

我有一個查詢SQL找到行的值

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。請讓我知道這是否可能。 (由不同的/組將刪除重複,但仍將保持在一個行,我不需要)

回答

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_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 /墨西哥/美國。後兩者有1,因爲他們的三胞胎是獨一無二的。

+0

感謝@Gordon能否請您解釋一下這個COUNT(*)在9 ...在這裏做這樣我就可以用它未來。 – Zeus 2014-10-28 15:50:23

+0

今天學到了新東西。謝謝戈登。 – Zeus 2014-10-28 16:06:25

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 
+0

我喜歡你的答案。我現在覺得不使用子句是愚蠢的。再次感謝! – Zeus 2014-10-28 16:07:04