2014-05-12 64 views
0

我有表table_test Oracle數據庫:Oracle數據庫遞歸

id | p_id 
--------- 
1 | null 
2 | 1 
3 | 2 
4 | 1 
5 | 3 
6 | 4 
7 | 3 
8 | 5 
9 | 6 
10 | 7 

,我需要得到所有層次ID(S),其ID = X? 結果應該是如下:

x? = 1 --> 1 
x? = 2 --> 2,1 
x? = 3 --> 3,2,1 
x? = 4 --> 4,1 
x? = 5 --> 5,3,2,1 
x? = 6 --> 6,4,1 
x? = 7 --> 7,3,2,1 
x? = 8 --> 8,5,3,2,1 
x? = 9 --> 9,6,4,1 
x? = 10 --> 10,7,3,2,1 

什麼是SQL我應該用得到這些結果?

非常感謝所有

+0

搜索「connect by」 –

回答

2

感謝所有,我得到了解決:

在Oracle SQL:

SELECT T.* 
FROM table_test T 
START WITH T.ID =X? 
CONNECT BY PRIOR T.P_ID = T.ID 

IN H2 & SQLServer的SQL:

WITH LINK(ID, PARENT_ID) AS (
SELECT ID, PARENT_ID 
FROM TABLE_TEST 
WHERE ID = X? 
UNION ALL 
SELECT TABLE_TEST.ID, TABLE_TEST.PARENT_ID 
FROM LINK 
INNER JOIN TABLE_TEST ON LINK.PARENT_ID = TABLE_TEST.ID) 

SELECT * 
FROM LINK 
ORDER BY ID; 
+0

H2/SQL Server解決方案也適用於Postgres,Firebird,DB2,SQLite,SQL Server和Oracle 11.2。對於Postgres和Firebird,你需要在遞歸鏈接(....)裏添加關鍵字'遞歸'給CTE:'這是根據SQL標準強制的。 –