DECLARE @Order TABLE (OrderID INT NOT NULL, LinkOrderID INT NOT NULL)
INSERT
INTO @Order
VALUES (787016, 787037)
INSERT
INTO @Order
VALUES (787037, 787786)
INSERT
INTO @Order
VALUES (787786, 871702)
/*
INSERT
INTO @Order
VALUES (871702, 787016)
*/
;WITH q (OrderId, LinkOrderId, InheritanceOrder, FirstItem) AS
(
SELECT OrderID, LinkOrderId, 1, OrderID
FROM @Order
WHERE OrderID = 787786
UNION ALL
SELECT o.OrderId, o.LinkOrderId, q.InheritanceOrder + 1, q.FirstItem
FROM q
JOIN @Order o
ON o.OrderID = q.LinkOrderId
WHERE o.OrderID <> q.FirstItem
UNION ALL
SELECT LinkOrderId, NULL, q.InheritanceOrder + 1, q.FirstItem
FROM q
WHERE q.LinkOrderID NOT IN
(
SELECT OrderID
FROM @Order
)
)
SELECT OrderID, InheritanceOrder
FROM q
ORDER BY
InheritanceOrder
Предполагается, что и OrderID
, и LinkOrderID
являются уникальными (т. Е. Это связанный список, а не дерево).
Работает и с последней вставкой без комментариев (что делает цикл)