Я тему CTE как-то забросил, а тут решил снова поковыряться ине получилось.
Вот уменя таблица Phases, смотрите:
Id ParentPhaseId
-----------------------
491 NULL
494 491
497 494
498 NULL
Запрос:
WITH RECURSIVE
"RootPhases" AS (
SELECT P."Id", P."ParentPhaseId" FROM "Phases" P WHERE
P."ParentPhaseId" IS NULL
),
"NonRootPhases" AS (
SELECT P."Id", P."ParentPhaseId" FROM "Phases" P, "RootPhases" P1
WHERE P."ParentPhaseId" = P1."Id"
)
SELECT * FROM "RootPhases"
UNION ALL
SELECT * FROM "NonRootPhases"
Результат:
Id ParentPhaseId
-----------------------
491 NULL
498 NULL
494 491
Ясли я что-то неправильно сделал, поправьте пожалуйста.
Если правильно, то имею две претензии:
1) Записи глубже второго уровня не выбирает
2) Порядок возвращённых результатов никак не похож на рекурсивный. Для
меня важно чтобы был в порядке вложенности элементов:
Id ParentPhaseId
-----------------------
491 NULL
494 491
497 494
498 NULL