"sasha" ...
>
> Я тут напряг мозг как бы одним запросом сделать копирование иерархии.
> Сделать то я сделал, но получается что от перестановки мест полей
> кардинально меняется результат.
>
> Знач вопроссначала теоретический. Если я в рекурсивном CTE использую
> ссылку на самого себя, то нормально ли то что в разных частях запроса
> используются разные значения с предыдущего уровня?

    А что такое "разные значения с предыдущего уровня" ?

> Вот пример запроса, который правильно клонирует иерархию:
>
> WITH RECURSIVE "Tree" ("OldPhaseId", "OldParentPhaseId",
> "NewParentPhaseId", "NewPhaseId") AS (
>    SELECT P."Id", P."ParentPhaseId", CAST(NULL AS INTEGER),
> GEN_ID("GenWbsElementsId", 1)
>      FROM "Phases" P WHERE P."ParentPhaseId" IS NULL
>    UNION ALL
>    SELECT P."Id", P."ParentPhaseId", T."NewPhaseId",
> GEN_ID("GenWbsElementsId", 1)
>      FROM "Phases" P, "Tree" T WHERE P."ParentPhaseId" = T."OldPhaseId" )
> SELECT "OldPhaseId", "OldParentPhaseId", "NewPhaseId",
> "NewParentPhaseId" FROM "Tree"
>
>
> А вот пример запроса, который в части WHERE использует старое значение
> верхнего уровня, а в части SELECT новое!!!
>
> WITH RECURSIVE "Tree" ("OldPhaseId", "OldParentPhaseId", "NewPhaseId",
> "NewParentPhaseId") AS (
>    SELECT P."Id", P."ParentPhaseId", GEN_ID("GenWbsElementsId", 1),
> CAST(NULL AS INTEGER)
>      FROM "Phases" P WHERE P."ParentPhaseId" IS NULL
>    UNION ALL
>    SELECT P."Id", P."ParentPhaseId", GEN_ID("GenWbsElementsId", 1),
> T."NewPhaseId"
>      FROM "Phases" P, "Tree" T WHERE P."ParentPhaseId" = T."OldPhaseId" )
> SELECT "OldPhaseId", "OldParentPhaseId", "NewPhaseId",
> "NewParentPhaseId" FROM "Tree"
>
> Здесь на выходе "OldParentPhaseId" всегда кроме первого уровня равно
> "NewPhaseId"

    Ты решил меня окончательно запутать ? Мало того, что запросы не
читабельны, скрипт на воспроизведение я должен сам родить, так ты ещё
и с именами полей путаешься ...

    "NewPhaseId" у тебя равно "NewParentPhaseId", а не так как ты написал.

    Есть такая грабля, пока не вижу как её можно быстро починить.
Как workaround - поменяй местами "NewPhaseId" и "NewParentPhaseId"

> Нормально ли такое поведение с точки зрения стандарта, атомарности и
> т.п. теории.

    А причём тут эти высокие материи ? :)

> А также маленькая проблемка обнаружилась. Если я убираю в первом запросе
> CAST, то получаю сообщение типа:
> Overflow occurred during data type conversion.
> conversion error from string "553".

    Полям неизвестного типа назначается CHAR (чего-то там не помню, скорее 
всего 1).
В где тут проблемка ?

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


Ответить