2009-10-01 138 views
0

我在SQL Server 2005中的表中有一個數據結構,代表一系列相關對象。每個對象都可以在許多步驟中進行替換。我想執行一個查詢,返回替換鏈中的所有對象和每個對象的葉子。SQL Server 2005中的分層查詢

數據:

id replacement 
1 null 
2 3 
3 null 
4 5 
5 6 
6 null 

結果應該是:

id replacement 
1 null 
2 3 
3 null 
4 6 
5 6 
6 null 

我相信,一個遞歸CTE將是一個很好的路要走,但我不能換我的頭周圍。對這個問題的限制是我無法改變數據結構,因爲數據庫不在我的控制之下。

回答

3

看一看這個

DECLARE @Table TABLE(
     ID INT, 
     ReplacementID INT 
) 

INSERT INTO @Table (ID,ReplacementID) SELECT 1, NULL 
INSERT INTO @Table (ID,ReplacementID) SELECT 2, 3 
INSERT INTO @Table (ID,ReplacementID) SELECT 3, NULL 
INSERT INTO @Table (ID,ReplacementID) SELECT 4, 5 
INSERT INTO @Table (ID,ReplacementID) SELECT 5, 6 
INSERT INTO @Table (ID,ReplacementID) SELECT 6, NULL 

INSERT INTO @Table (ID,ReplacementID) SELECT 7, 8 
INSERT INTO @Table (ID,ReplacementID) SELECT 8, 9 
INSERT INTO @Table (ID,ReplacementID) SELECT 9, 10 
INSERT INTO @Table (ID,ReplacementID) SELECT 10, NULL 

SELECT * FROM @Table 

;WITH repl AS (
    SELECT *, 1 AS Depth 
    FROM @Table t 
    UNION ALL 
    SELECT r.ID, 
      t.ReplacementID, 
      r.Depth + 1 
    FROM repl r INNER JOIN 
      @Table t ON r.ReplacementID = t.ID 
    WHERE t.ReplacementID IS NOT NULL 
) 
SELECT repl.ID, 
     repl.ReplacementID 
FROM (
      SELECT ID, 
        MAX(Depth) Depth 
      FROM repl 
      GROUP BY ID 
     ) Depths INNER JOIN 
     repl ON Depths.ID = repl.ID 
       AND Depths.Depth = repl.Depth 
ORDER BY 1 
+0

+1,對我來說很好 – 2009-10-01 11:51:51

+0

工程就像一個魅力,謝謝! – PHeiberg 2009-10-01 11:54:05