У меня есть таблица списка смежности, где мне нужно клонировать набор узлов и вставить его в новую ветку. В основном я хочу клонировать набор узлов, имеющих одинаковую структуру родительских узлов в новой ветке. Я использую временную таблицу, в которой у меня есть исходные и вставленные узлы. Я попытался присоединиться к временной таблице по элементам и использовать CTE, но получил неверный результат.
Я проверил этот ответ, но он не работает, если родительские узлы одинаковы для более чем 1 элемента.
Как правильно обновить родительские узлы (за исключением корневого узла)?
Есть ли способ обновить его без использования временной таблицы?
Стол
|node|parent|item|
| 1 | Null | a |
| 2 | 1 | b |
| 3 | 1 | c |
Клонированные узлы
|node|parent|item|
| 4 | Null | a |
| 5 | 1 | b |
| 6 | 1 | c |
Временная таблица
|inserted_node|old_node|item|old_parent|
| 4 | 1 | a | Null |
| 5 | 2 | b | 1 |
| 6 | 3 | c | 1 |
Ожидаемый результат
|node|parent|item|
| 1 | Null | a |
| 2 | 1 | b |
| 3 | 1 | c |
| 4 | Null | a |
| 5 | 4 | b |
| 6 | 4 | c |
Неверный результат
|node|parent|item|
| 1 | Null | a |
| 2 | 1 | b |
| 3 | 1 | c |
| 4 | Null | a |
| 5 | 5 | b |
| 6 | 6 | c |
SQL-запрос
;WITH CTE AS
(
SELECT
t.parent AS old_parent,
t2.node AS new_parent
FROM Table t
LEFT JOIN @TempTable t2 ON t2.item = t.item
WHERE t.node IN (SELECT node FROM @TempTable ) AND t.parent IS NOT NULL
)
UPDATE CTE
SET old_parent = new_parent