Я тут напряг мозг как бы одним запросом сделать копирование иерархии.
Сделать то я сделал, но получается что от перестановки мест полей
кардинально меняется результат.
Знач вопроссначала теоретический. Если я в рекурсивном 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".