Как установить родительский идентификатор узла с помощью запроса в SQL Server?

Я создаю хранимую процедуру, которая добавляет дерево, вставляет узлы в это дерево, а затем обновляет узлы, чтобы включить родительский идентификатор. Я обновляю узлы, чтобы включить родительский идентификатор, потому что родительские узлы вставляются одновременно с дочерними узлами, поэтому у них еще нет идентификатора.

Моя проблема в том, что я не могу создать запрос, который установит коды родительского идентификатора в столбце правильных дочерних узлов. Я пробовал JOIN, UNION, INTERSECT и подзапросы, но мне не удалось заставить его работать.

Заявление об обновлении:

UPDATE [dbo].[Node]
SET ParentId = dn.Code
FROM [dbo].[Node] as dn
???

Переменная @nodes представляет собой таблицу, содержащую следующее:

node_code parent_code «001» нулевой «002» нулевой «003» «001» «004» «003»

Существующие данные в таблице узлов перед попыткой обновить ParentId:

идентификатор Код идентификатор родителя 00000000-0000-0000-0000-000000000001 «001» нулевой 00000000-0000-0000-0000-000000000002 «002» нулевой 00000000-0000-0000-0000-000000000003 «003» нулевой 00000000-0000-0000-0000-000000000004 «004» нулевой

Таблица 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)

Присоединитесь к Node, @nodes и другой таблице Node (в качестве родителя) на parent_code и обновите идентификатор от родителя. Покажите нам свои попытки, иначе нам нечего исправлять :)

Arvo 15.12.2020 13:46

Куда идут значения из @Nodes в вашей таблице? 2 столбца в вашей переменной оба являются varchar(3), но в таблице MAX есть только uniqueidentifier и 3 столбца dbo.Node. Нет даже 1, не говоря уже о 2 столбцах varchar (не MAX) для значений.

Thom A 15.12.2020 13:47

Фактические данные выборки и ожидаемые результаты, вероятно, помогут нам помочь вам здесь.

Thom A 15.12.2020 13:48

@Arvo, когда я присоединяюсь к таблице Node во второй раз, я получаю сообщение об ошибке, что [dbo].[Node] в строке UPDATE [dbo].[Node] неоднозначно. Вы знаете, как это решить?

Friso 15.12.2020 14:02

@Larnu значения @nodes показывают, какие коды должны иметь какие родительские коды. Это таблица соединений, которая используется для создания этой связи, например, узел с кодом «003» должен иметь id узла с кодом «001», поскольку он parentid

Friso 15.12.2020 14:07

@Arvo, ваш ответ сработал, я подписался на stackoverflow.com/a/34271364/1984657, чтобы исправить неоднозначную ошибку. Если вы напишете свое решение в качестве ответа, я приму его.

Friso 15.12.2020 14:13
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
684
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если ваша табличная переменная @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 и так далее.

Friso 15.12.2020 14:04

Возможно, у меня просто была опечатка, которая испортила предикат для соединения. Но это определенно то, как вы туда доберетесь. Я проверил это на моей стороне очень быстро. Он обновляется, как я и ожидал. Я внес изменения; Проверьте меня дважды.

Jeffrey Eldredge 15.12.2020 14:13
Ответ принят как подходящий

Опубликовано как ответ по запросу.

Присоединитесь к 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

Другие вопросы по теме