Установка Oracle :
CREATE TABLE item ( id, name, parent_id ) AS
SELECT 1, 'A', NULL FROM DUAL UNION ALL
SELECT 2, 'B', 1 FROM DUAL UNION ALL
SELECT 3, 'C', 2 FROM DUAL UNION ALL
SELECT 4, 'D', 3 FROM DUAL UNION ALL
SELECT 5, 'E', 2 FROM DUAL;
Вы можете получить предмет и всех его предков, используя:
SELECT *
FROM item
START WITH id = 2
CONNECT BY PRIOR parent_id = id
и вы можете получить всех потомков этого предмета, используя:
SELECT *
FROM item
START WITH parent_id = 2
CONNECT BY PRIOR id = parent_id
И вы можете объединить их, используя UNION ALL
. Тем не менее, это ставит сопоставленный элемент сначала, затем предков, в порядке увеличения предков, затем потомков в порядке уменьшения предков ..., что может сбивать с толку.
Таким образом, вы можете изменить порядок запроса, чтобы поместить оба в согласованный порядок:
SELECT *
FROM (
SELECT *
FROM item
START WITH id = 2
CONNECT BY PRIOR parent_id = id
ORDER BY LEVEL DESC
)
UNION ALL
SELECT *
FROM (
SELECT *
FROM item
START WITH parent_id = 2
CONNECT BY PRIOR id = parent_id
ORDER SIBLINGS BY name
);
выход
ID NAME PARENT_ID
-- ---- ---------
1 A -
2 B 1
3 C 2
4 D 3
5 E 2