2015-09-07 57 views
1

有人可以幫我解決這個問題嗎?任何其他選項都沒有使用Oracle分析功能

CREATE TABLE TT (
    A NUMBER PRIMARY KEY, 
    B VARCHAR2(5) 
); 

insert into tt values (11,'A'); 
insert into tt values (12,'A'); 
insert into tt values (13,'B'); 
insert into tt values (14,'B'); 
insert into tt values (15,'C'); 
insert into tt values (16,'D'); 
insert into tt values (17,'E'); 
insert into tt values (18,'E'); 
insert into tt values (19,'F'); 
insert into tt values (20,'F'); 

COMMIT; 

SELECT * FROM TT; 

+---+---+ 
| A | B | 
+---+---+ 
|11 | A | 
|12 | A | 
|13 | B | 
|14 | B | 
|15 | C | 
|16 | D | 
|17 | E | 
|18 | E | 
|19 | F | 
|20 | F | 
+---+---+ 

我的要求是什麼的「B」列已映射「A」列贊(值「E」已在「A」的柱映射兩行) O/P

的多於一個
+---+ 
| A | 
+---+ 
| 11| 
| 12| 
| 13| 
| 14| 
| 17| 
| 18| 
| 19| 
| 20| 
+---+ 

我已經實現了使用下面的分析查詢。我想知道是否可以在沒有分析功能的情況下進行歸檔。

select a 
from (SELECT tt.*, COUNT(*) over (partition by b) cnt 
     FROM TT 
    ) 
where cnt >= 2; 

+0

爲什麼你不想使用分析功能? –

+0

其很好,但我想知道任何其他選項,以達到相同的結果 –

回答

0

您可以使用一組由考生:

select a 
from tt 
where B in (
      select B 
      from tt 
      group by b 
      having count(*) >= 2); 
+0

謝謝弗洛林:) –

1

這是聚合很容易:

select a 
from tt 
where b in (select b from tt group by b having count(*) > 1); 

作爲一個說明,你能避免使用的聚合,因爲Oracle提供了rowid僞列:

select a 
from tt 
where exists (select 1 
       from tt tt2 
       where tt2.b = tt.b and tt2.rowid <> tt.rowid 
      ); 
+0

謝謝戈登:) –

0
select a from temp a where exists (select null from temp b where a.b = b.b group by b having count(1) >= 2) 

這是替代solution.i認爲你不能避免在這種情況下使用聚合函數。

+0

你可以避免聚合。 –

+0

是的Gordon看到了你沒有使用聚合函數的解決方案.. :-) –

相關問題