Вы можете сделать это с помощью APPLY
. Предпосылка состоит в том, чтобы найти родительскую запись с наивысшим идентификатором, где идентификатор ниже, чем у дочерней записи.
Пример
DECLARE @x2 TABLE (ID INT NOT NULL, Text CHAR(1), IsParent BIT, ParentID INT);
INSERT @x2 (ID, Text, IsParent)
VALUES
(1, 'A', 1), (2, 'B', 0), (3, 'C', 0), (4, 'D', 0),
(5, 'E', 1), (6, 'F', 0), (7, 'G', 1), (8, 'H', 0);
UPDATE c
SET ParentID = p.ID
FROM @x2 AS c
CROSS APPLY
( SELECT TOP 1 ID
FROM @x2 AS p
WHERE p.IsParent = 1 -- Is a parent record
AND p.ID < c.ID -- ID is lower than child record
ORDER BY p.ID DESC -- Order descending to get the highest ID
) AS p
WHERE c.IsParent = 0
AND c.ParentID IS NULL;
SELECT *
FROM @x2;
OUTPUT
ID Text IsParent ParentID
---------------------------------
1 A 1 NULL
2 B 0 1
3 C 0 1
4 D 0 1
5 E 1 NULL
6 F 0 5
7 G 1 NULL
8 H 0 7