Я предполагаю, что из вашей ссылки на 'left and right' вы говорите о представлении вложенного множества дерева. В этом случае репликация всей ветви не так уж отличается от добавления одного узла, процесс в основном:
- Открыть пробел в левой и правой последовательности для новых узлов
- Вставьте новые узлы с правильными последовательностями
Итак, если ваши деревья нумеруются следующим образом:
Root (1, 27)
Folder 1 (2, 8)
Item (3, 4)
Item (5, 6)
Item (6, 7)
Folder 2 (9, 14)
Item (10, 11)
Item (12, 13)
Folder 3 (15, 26)
Folder 4 (16, 21)
Item (17, 18)
Item (19, 20)
Folder 5 (22, 25)
Item (23, 24)
Root 2 (1, 4)
Folder 6 (2, 3)
И деревья находятся в разных таблицах, код для репликации папки 3 ниже папки 6 находится в блоке ниже. Некоторые из конструкций SQL, такие как UPDATE ... FROM ..., могут синтаксически немного отличаться в вашей среде, те, что приведены ниже, используются в PostgreSQL. Я считаю, что MSSQL требует, чтобы обновляемая таблица была включена в предложение FROM.
-- Push the items below this point down the sequence by as much as is required to accomadate the new branch (Not required in this case, but here for completeness)
UPDATE tree2 SET leftsequence = leftsequence + (tree.rightsequence - tree.leftsequence), rightsequence = rightsequence + (tree.rightsequence - tree.leftsequence)
FROM tree
WHERE tree2.leftsequence > 2 AND tree2.rightsequence = 3
AND tree.leftsequence = 15;
-- Copy the nodes
INSERT INTO tree2 (label, leftsequence, rightsequence)
SELECT label, leftsequence - (15 - 2) + 1, rightsequence - (15 - 2) + 1
FROM tree
WHERE leftsequence BETWEEN 15 AND 26;