2012-07-22 7 views
12

子のIDが与えられた場合、ルートの親に到達するまで、その子の親とその親をすべて含むクエリを返す必要があります。 たとえば、このデータを与えられた:子を与えられたすべての祖先を再帰的に見つける

ID/Parent ID 
1/0 
2/1 
3/2 
4/0 
5/3 

私はID 5に渡されたのであれば、私は結果でクエリを取得したいと思います:

ID/Parent ID 
1/0 
2/1 
3/2 

このテーブルには、そのhierarchyid型タイプでは動作しません。私はCTEでこれを行う必要があると思うが、手がかりはない。それがSQLクエリ/ procで行えるのであれば、どんな助けもありがたいです。

おかげ

答えて

20

これは、多かれ少なかれ、あなたが望むものである:

-- CTE to prepare hierarchical result set 
;WITH #results AS 
(
    SELECT id, 
      parentid 
    FROM [table] 
    WHERE id = @childId 
    UNION ALL 
    SELECT t.id, 
      t.parentid 
    FROM [table] t 
      INNER JOIN #results r ON r.parentid = t.id 
) 
SELECT * 
FROM #results; 

参考:

の作業例:

-- create table with self lookup (parent id) 
CREATE TABLE #tmp (id INT, parentid INT); 

-- insert some test data 
INSERT INTO #tmp (id, parentid) 
SELECT 1,0 UNION ALL SELECT 2,1 UNION ALL SELECT 3,2 
UNION ALL SELECT 4,0 UNION ALL SELECT 5,3; 

-- prepare the child item to look up 
DECLARE @childId INT; 
SET @childId = 5; 

-- build the CTE 
WITH #results AS 
(
    SELECT id, 
      parentid 
    FROM #tmp 
    WHERE id = @childId 
    UNION ALL 
    SELECT t.id, 
      t.parentid 
    FROM #tmp t 
      INNER JOIN #results r ON r.parentid = t.id 
) 

-- output the results 
SELECT * 
FROM #results 
WHERE id != @childId 
ORDER BY id; 

-- cleanup 
DROP TABLE #tmp; 

出力:

1 | 0
2 | 1
3 | 2

+0

これはちょうど素晴らしいです。私が作ったのは、最後のSELECTでDISTINCT句を使うことでした。私は、私が働いている小さなレコードセットのためにパフォーマンスが心配されていません。これは、重複を除外し、最初のCTEクエリのWHERE句に入れた基準に基づいて、必要な階層を返します(私の場合はid = @childIdを使用しません) – bcr

関連する問題