2009-10-01 3 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

하나를 살펴 보라 매력처럼 작동 –

+0

나에게 좋아 보인다, 감사합니다! – PHeiberg