Вы можете использовать псевдостолбец CONNECT_BY_ISLEAF
, чтобы найти листья дерева иерархии, а затем использовать функцию CONNECT_BY_ROOT( ... )
, чтобы получить значения при начале навигации по дереву:
SQL Fiddle
Настройка схемы Oracle 11g R2 :
CREATE TABLE DEPARTMENT( DEP_ID, DEP_NAME, PARENT_DEP_ID ) AS
SELECT 'DEP_2000', 'Dep0', NULL FROM DUAL UNION ALL
SELECT 'DEP_2400', 'Dep1', 'DEP_2000' FROM DUAL UNION ALL
SELECT 'DEP_2410', 'Dep2', 'DEP_2400' FROM DUAL UNION ALL
SELECT 'DEP_2420', 'Dep3', 'DEP_2400' FROM DUAL;
Запрос 1 :
SELECT CONNECT_BY_ROOT( DEP_ID ) AS DEP_ID,
CONNECT_BY_ROOT( DEP_NAME ) AS DEP_NAME,
CONNECT_BY_ROOT( PARENT_DEP_ID ) AS PARENT_DEP_ID,
DEP_ID AS MASTER_PARENT_DEP_ID
FROM DEPARTMENT
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR PARENT_DEP_ID = DEP_ID
Результаты :
| DEP_ID | DEP_NAME | PARENT_DEP_ID | MASTER_PARENT_DEP_ID |
|----------|----------|---------------|----------------------|
| DEP_2000 | Dep0 | (null) | DEP_2000 |
| DEP_2400 | Dep1 | DEP_2000 | DEP_2000 |
| DEP_2410 | Dep2 | DEP_2400 | DEP_2000 |
| DEP_2420 | Dep3 | DEP_2400 | DEP_2000 |
Примечание. При обходе дерева от каждого элемента до корня, а не в обратном порядке, вам не требуется ни выражение START WITH
, ниотдельный запрос для поиска корней.
Это будет работать, даже если нет строки DEP_2000
(просто измените DEP_ID
на PARENT_DEP_ID
):
SQL Fiddle
Настройка схемы Oracle 11g R2 :
CREATE TABLE DEPARTMENT( DEP_ID, DEP_NAME, PARENT_DEP_ID ) AS
--SELECT 'DEP_2000', 'Dep0', NULL FROM DUAL UNION ALL
SELECT 'DEP_2400', 'Dep1', 'DEP_2000' FROM DUAL UNION ALL
SELECT 'DEP_2410', 'Dep2', 'DEP_2400' FROM DUAL UNION ALL
SELECT 'DEP_2420', 'Dep3', 'DEP_2400' FROM DUAL;
Запрос 1 :
SELECT CONNECT_BY_ROOT( DEP_ID ) AS DEP_ID,
CONNECT_BY_ROOT( DEP_NAME ) AS DEP_NAME,
CONNECT_BY_ROOT( PARENT_DEP_ID ) AS PARENT_DEP_ID,
PARENT_DEP_ID AS MASTER_PARENT_DEP_ID
FROM DEPARTMENT
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR PARENT_DEP_ID = DEP_ID
Результаты :
| DEP_ID | DEP_NAME | PARENT_DEP_ID | MASTER_PARENT_DEP_ID |
|----------|----------|---------------|----------------------|
| DEP_2400 | Dep1 | DEP_2000 | DEP_2000 |
| DEP_2410 | Dep2 | DEP_2400 | DEP_2000 |
| DEP_2420 | Dep3 | DEP_2400 | DEP_2000 |