"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).
В где тут проблемка ?
--
Хорсун Влад