请不要在没有阅读的情况下将问题标记为重复。我发布了一个类似的问题,但是,由于解决方案更加复杂,小型,次要的修改,STACKOVERFLOW社区成员要求我重新发布修改后的问题。
假设您有以下架构:
CREATE TABLE Data
(
ID INT,
CXL INT
)
INSERT Data (ID, CXL)
VALUES
(1, NULL),
(2, 1),
(3, 2),
(5, 3),
(6, NULL),
(7, NULL),
(8, 7);
列CXL是取消特定ID的ID。因此,例如,ID为1的表中的第一行是好的,直到它被ID:2(CXL列)取消。 ID:2一直很好,直到它被ID:3取消。 ID:3是好的,直到它被ID:5取消所以在这个序列中最后一个" GOOD" ID为ID:5。
对于每个ID,我想找到" GOOD" ID和EACH链的原始ID。所以在这个例子中它将是:
ID | Original ID | Latest GOOD ID
1 1 5
2 1 5
3 1 5
5 1 5
6 6 6
7 7 8
8 7 8
如果你想玩这个,这里有一个小提琴: http://sqlfiddle.com/#!6/b794f/1
答案 0 :(得分:2)
这可以给你你想要的东西:
;WITH CTE AS (
SELECT ID AS Parent, ID, CXL, 0 AS level
FROM Data
WHERE CXL IS NULL
UNION ALL
SELECT c.Parent AS Parent, d.ID, d.CXL, level = level + 1
FROM CTE AS c
INNER JOIN Data AS d ON c.ID = d.CXL
)
SELECT ID, Parent AS OriginalID, t.GoodID
FROM CTE AS c
CROSS APPLY (
SELECT ID AS GoodID
FROM CTE AS c2
WHERE level = (SELECT MAX(level) FROM CTE WHERE Parent = c.Parent)
AND c2.Parent = c.Parent
) t(GoodID)
ORDER BY Parent