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

    А где ты тут видишь рекурсивный запрос-то ? :)))

> Ясли я что-то неправильно сделал,

    Лыжи работают праально, проверяй вторую часть гипотезы  ;)

> поправьте пожалуйста.

WITH RECURSIVE
 "Tree" AS (
    SELECT P."Id", P."ParentPhaseId" FROM "Phases" P
    WHERE  P."ParentPhaseId" IS NULL


    UNION ALL

    SELECT P."Id", P."ParentPhaseId" FROM "Phases" P, "Tree" P1
    WHERE P."ParentPhaseId" = P1."Id"
 )
SELECT * FROM "Tree"

> Если правильно, то имею две претензии:
>
> 1) Записи глубже второго уровня не выбирает

    Ибо ты написал 2 запроса на выборку 1-го и 2-го уровней

> 2) Порядок возвращённых результатов никак не похож на рекурсивный. Для
> меня важно чтобы был в порядке вложенности элементов:

    Это обсуждаться не будет, не зависимо от того устраивает ли текущий
порядок обхода дерева (в глубину) кого-либо или нет.
По крайней мере в 2.1 и в 3.0

    Впрочем в данном случае тебя должно устраивать ;)

--
Хорсун Влад


Ответить