Я тут напряг мозг как бы одним запросом сделать копирование иерархии. Сделать то я сделал, но получается что от перестановки мест полей кардинально меняется результат.

Знач вопроссначала теоретический. Если я в рекурсивном 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"


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


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

Ответить