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