Я тему 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

Ответить