Прежде всего, прародитель может иметь много детей или ParentID в этом случае , поэтому не является хорошим предположением, что только потому, что отношения между родителем и ребенком существуют на уровне 1, он также будет существовать на уровне 2.
Итак, я советую углубиться в данные немного больше, чтобы узнать, есть ли какой-либо способ, вы можете найти истинные отношения для уровня 2.
Если вы намерены запустить обновление, вы должны по крайней мере обеспечить что есть один и только один ParentID для каждого grandparentId назначенного на уровне 1 перед обновлением строки на уровне 2.
Вот пример:
DECLARE @Table TABLE
(
ID INT PRIMARY KEY IDENTITY
,Level INT
,ParentId INT
,GrandparentId INT
);
INSERT INTO @Table
(
Level
,ParentId
,GrandparentId
)
VALUES
(1, 205, 280)
,(1, 206, 281)
,(1, 207, 282)
,(1, 208, 282)
,(2, null, 280)
,(2, null, 280)
,(2, null, 281)
,(2, null, 282);
SELECT * FROM @Table;
UPDATE T SET ParentId = T2.TheOneAndOnlyParentId
FROM
@Table T
JOIN
(
SELECT
GrandparentId
,MAX(ParentID) AS TheOneAndOnlyParentId
FROM
@Table
WHERE
ParentId IS NOT NULL
AND Level = 1
GROUP BY
GrandparentId
HAVING
MIN(ParentID) = MAX(ParentID)
) T2
ON T.GrandparentId = T2.GrandparentId
WHERE
T.Level = 2;
SELECT * FROM @Table;
Обратите внимание, как один уровень-два строка не была обновлена , Это связано с тем, что отношения уровня один были неясны.