небольшая разминка мозга для любителей SQL
От: L_G Россия  
Дата: 20.04.22 21:24
Оценка:
В табличке хранятся разные деревья, т.е. группы записей, иерархически связанные по ParentId -> Id (ParentId is null — "корни").
Упрощенно, такая структура:
create table Trees (
Id int identity (1, 1) primary key, -- автоинкрементное поле в синтаксисе MS SQL
ParentId int null foreign key references Trees(Id), -- можно и без констрейнта, не суть
TreeId int not null ) -- все узлы с одним TreeId - это одно дерево, а "корней" м.б. и несколько
Задача — склонировать дерево (для каждой записи из набора с одним TreeId создать по 1 записи с новым TreeId с сохранением структуры ссылок ParentId -> Id).
Можно ли написать такую процедуру/скрипт без всякой рекурсии и циклов, простыми insert/update?
А без временных таблиц и т.п.?
Старые Id могут быть с разрывами, а новые Id пойдут подряд — это автоинкремент, мы до вставки их вообще не узнаем.
На входе — 2 параметра/переменных, @OldTreeId и @NewTreeId (можно рассчитывать, что записей с TreeId=@NewTreeId в табличке нет.)
И можно рассчитывать, что все связи ParentId -> Id — внутри группы записей с одним TreeId.

Решение я нашел, а у вас получится? Задача на реальном проекте возникла, кстати.
Отредактировано 20.04.2022 21:29 L_G . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.