2015-12-18 71 views
2

我的表結構查找父(任何級別)的最子節點在Oracle

| Parent ID | ID   | 
|-------------|-------------| 
|  a  |  b  | 
|  b  |  c  | 
|  b  |  d  | 
|  b  |  e  | 
|  c  |  f  | 
|  d  |  g  | 
|  e  |  h  | 

我想所有父母最子節點。 在另一張表中我有a,b和c。然後我想獲得下面的結果。

| Parent_ID | Child  | 
|-------------|-------------| 
|  a  |  f  | 
|  a  |  g  | 
|  a  |  h  | 
|  b  |  f  | 
|  b  |  g  | 
|  b  |  h  | 
|  c  |  f  | 

f,g,h是最低的粒度。

+0

。 –

回答

4

「大多數孩子節點」我希望你的意思是樹的葉節點。您可以使用分層結構(CONNECT BY)查詢的CONNECT_BY_ISLEAF僞列確定葉節點。

鑑於一個表中的下列查詢產生所期望的結果的示例數據:

select connect_by_root id id 
    , parent_did 
    from table1 
where connect_by_isleaf = 1 
connect by id = prior parent_did 
    start with id in ('a','b','c'); 

| ID | PARENT_DID | 
|----|------------| 
| a |   f | 
| a |   g | 
| a |   h | 
| b |   f | 
| b |   g | 
| b |   h | 
| c |   f | 

SQL Fiddle

以更新後的數據和要求考慮包括一個第二表保存的a,b的事實和C作爲啓動條件:

select connect_by_root parent_id parent_id 
    , id 
    from table1 
where connect_by_isleaf = 1 
connect by prior id = parent_id 
    start with parent_id in (select id from table2) 

| PARENT_ID | ID | 
|-----------|----| 
|   a | f | 
|   a | g | 
|   a | h | 
|   b | f | 
|   b | g | 
|   b | h | 
|   c | f | 

SQL Fiddle 你可以學習MO關於來自documentation的分層查詢。

+0

謝謝。但在問題ID和家長ID col被交換。我現在糾正了相同的情況。 – user2258035

0

首先,你應該確保你使用的是Oracle的願景10g或更高版本,然後使用CONNECT_BY_ISLEAF,你可以嘗試這裏您需要一個遞歸查詢,以瞭解更多有關connect_by

select connect_by_root a.id as id,a.parent_did 
     from table1 a inner join table2 b on a.id=b.id 
     where connect_by_isleaf = '1' 
     CONNECT BY PRIOR a.parent_did = a.id; 
相關問題