您如何找到链的原始ID,第一个ID和最后一个ID?

时间:2015-03-27 14:57:33

标签: sql sql-server

请不要在没有阅读的情况下将问题标记为重复。我发布了一个类似的问题,但是,由于解决方案更加复杂,小型,次要的修改,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

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

SQL Fiddle Demo