Re: небольшая разминка мозга для любителей SQL
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.04.22 09:00
Оценка: 1 (1)
Здравствуйте, L_G, Вы писали:

L_G>В табличке хранятся разные деревья, т.е. группы записей, иерархически связанные по ParentId -> Id (ParentId is null — "корни").

L_G>Упрощенно, такая структура:
L_G>
L_G>create table Trees (
L_G>Id int identity (1, 1) primary key, -- автоинкрементное поле в синтаксисе MS SQL
L_G>ParentId int null foreign key references Trees(Id), -- можно и без констрейнта, не суть
L_G>TreeId int not null ) -- все узлы с одним TreeId - это одно дерево, а "корней" м.б. и несколько
L_G>
Задача — склонировать дерево (для каждой записи из набора с одним TreeId создать по 1 записи с новым TreeId с сохранением структуры ссылок ParentId -> Id).

L_G>Можно ли написать такую процедуру/скрипт без всякой рекурсии и циклов, простыми insert/update?
L_G>А без временных таблиц и т.п.?

Легко
insert into Trees (ParentId, TreeId)
select Id, @NewTreeId 
from Trees
where TreeId = @OldTreeId 

update t1
set ParentId = t3.Id
from Trees t1 
join Trees t2 on t1.ParentId = t2.Id 
join Trees t3 on t3.ParentId = t2.ParentId
where t1.TreeId = @NewTreeId 
  and t2.TreeId = @OldTreeId
  and t3.TreeId = @NewTreeId


В универе же такое делают на уроках про графы\спиcки\деревья
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.