2017-07-07 50 views
0

我遇到以下問題。在oracle12 db中有數百萬個元素。我如何選擇層次結構的前N個對象。選擇哪個對象並不重要,唯一的要求是對象應該在heirarcy中。 Rownum過濾器根本不起作用:如何選擇層次查詢中的前N個元素(Oracle SQL)

SELECT object_id 
FROM objects 
WHERE rownum < 10 
START WITH object_id = 9072243521013844211 
CONNECT BY PRIOR object_id = parent_id 

我得到以下執行計劃:篩選在對象選擇後完成。

/* 
LEVEL PLAN ROWS COST PREDICATES 
*/ 
1 SELECT STATEMENT (OPTIMIZER=ALL_ROWS) 8 1 

2  COUNT   

3  FILTER   filter(ROWNUM<10) 

4   CONNECT BY (WITH FILTERING)   access("PARENT_ID"=PRIOR "OBJECT_ID") 

5   TABLE ACCESS (BY INDEX ROWID) "OBJECTS"   

6    INDEX (UNIQUE SCAN) "XPKOBJECTS" 1 1 access("OBJECT_ID"=9072243521013844211) 

5   NESTED LOOPS    

6    CONNECT BY PUMP   

6    TABLE ACCESS (BY INDEX ROWID BATCHED) "OBJECTS" 8 1 

7    INDEX (RANGE SCAN) "XIF25OBJECTS" 8 1 access("PARENT_ID"=PRIOR "OBJECT_ID") 
+0

你能解釋一下你所說的*「第一n個對象」的意思*?此外,如果您提供了一些示例數據和期望的結果,這將會很有幫助。順便說一下 - 您是否嘗試過使用「level」? – Plirkee

+0

你在哪個版本的Oracle?如果你在12,你可以使用fetch/offset,但是我會等待直到我聽到一個例子 – fleetmack

+0

這個問題還不清楚。 「唯一的要求是對象應該在heirarcy中」是什麼意思?與一些示例數據共享表格描述也有幫助。 –

回答

0

下面的例子解決方案應該提供一些指導:

with objects as 
(select level object_id, decode(level+1, :len+1, null, level+1) parent_id 
from dual connect by level<=:len) 
SELECT object_id 
FROM objects 
where level <= :n_objects 
START WITH object_id = 1 
CONNECT BY PRIOR parent_id = object_id 
;