Я создаю хранимую процедуру, которая добавляет дерево, вставляет узлы в это дерево, а затем обновляет узлы, чтобы включить родительский идентификатор. Я обновляю узлы, чтобы включить родительский идентификатор, потому что родительские узлы вставляются одновременно с дочерними узлами, поэтому у них еще нет идентификатора.
Моя проблема в том, что я не могу создать запрос, который установит коды родительского идентификатора в столбце правильных дочерних узлов. Я пробовал JOIN
, UNION
, INTERSECT
и подзапросы, но мне не удалось заставить его работать.
Заявление об обновлении:
UPDATE [dbo].[Node]
SET ParentId = dn.Code
FROM [dbo].[Node] as dn
???
Переменная @nodes
представляет собой таблицу, содержащую следующее:
Существующие данные в таблице узлов перед попыткой обновить ParentId:
Таблица Node создается следующим образом (упрощено, потому что моя содержит больше столбцов):
CREATE TABLE [dbo].[Node]
(
[Id] UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWSEQUENTIALID(),
[Code] VARCHAR(MAX),
[ParentId] UNIQUEIDNETIFIER FOREIGN KEY REFERENCES [Node](Id),
[TreeId] UNIQUEIDENTIFIER FOREIGN KEY REFERENCES [Tree](Id)
)
Моя последняя попытка была такой, но это установило родительский идентификатор как идентификатор дочернего элемента, родителя которого я пытаюсь добавить:
UPDATE [dbo].[Node]
SET ParentId = dn.Code
FROM [dbo].[Node] as dn
JOIN @nodes as n ON dn.Code = n.node_code
WHERE dn.TreeId = @treeId AND n.parent_code IN
(SELECT n2.parent_code
FROM [dbo].[Node] as dn2
JOIN @nodes as n2 ON dn2.Code = n2.parent_code
WHERE dn2.TreeId = @treeId)
Куда идут значения из @Nodes
в вашей таблице? 2 столбца в вашей переменной оба являются varchar(3)
, но в таблице MAX
есть только uniqueidentifier
и 3 столбца dbo.Node
. Нет даже 1, не говоря уже о 2 столбцах varchar
(не MAX
) для значений.
Фактические данные выборки и ожидаемые результаты, вероятно, помогут нам помочь вам здесь.
@Arvo, когда я присоединяюсь к таблице Node во второй раз, я получаю сообщение об ошибке, что [dbo].[Node]
в строке UPDATE [dbo].[Node]
неоднозначно. Вы знаете, как это решить?
@Larnu значения @nodes показывают, какие коды должны иметь какие родительские коды. Это таблица соединений, которая используется для создания этой связи, например, узел с кодом «003» должен иметь id
узла с кодом «001», поскольку он parentid
@Arvo, ваш ответ сработал, я подписался на stackoverflow.com/a/34271364/1984657, чтобы исправить неоднозначную ошибку. Если вы напишете свое решение в качестве ответа, я приму его.
Если ваша табличная переменная @nodes действительно является таблицей фактов, в которой вы хотите применить значение к [ParentId] в [Node], тогда UPDATE
с JOIN
должны работать.
UPDATE t1
SET t1.ParentId = t2.parent_code
FROM Node t1
INNER JOIN @nodes t2 ON t1.Code = t2.node_code
Когда я это делаю, parentId становится таким же, как Id во всех строках, поэтому, если Id = 1, то ParentId = 1, Id = 2, затем ParentId = 2 и так далее.
Возможно, у меня просто была опечатка, которая испортила предикат для соединения. Но это определенно то, как вы туда доберетесь. Я проверил это на моей стороне очень быстро. Он обновляется, как я и ожидал. Я внес изменения; Проверьте меня дважды.
Опубликовано как ответ по запросу.
Присоединитесь к Node, @nodes и другой таблице Node (в качестве родителя) к parent_code и обновите идентификатор от родителя, например:
update chld
set parentid = prnt.id
from dbo.Node chld
inner join @Nodes n on n.node_code = chld.code
inner join dbo.Node prnt on prnt.code = n.parent_code
Присоединитесь к Node, @nodes и другой таблице Node (в качестве родителя) на parent_code и обновите идентификатор от родителя. Покажите нам свои попытки, иначе нам нечего исправлять :)