2014-05-12 4 views
0

У меня есть базы данных Oracle с настольным table_test:Oracle Database Рекурсивный

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

и мне нужно, чтобы получить все иерархии идентификатор (ы), которая ID = х ?. результат должен быть следующим:

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 

В 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 вам нужно добавить ключевое слово 'recursive' в CTE:' с рекурсивной ссылкой (....) '- которое является обязательным в соответствии со стандартом SQL. –