2012-07-22 9 views
12

Bir çocuk kimliği verildiğinde, ana üstbilgiye ulaşana kadar, o çocuğun tüm ebeveynlerini ve ebeveynlerini içeren bir sorguyu geri göndermem gerekiyor. YaniÇocuğun verdiği tüm ataları özyinelemede buluyor

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

ben kimliği 5 geçirilen eğer sonuçları ile bir sorgu almak istiyorum: Bu veri Verilen örnek için ,

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

Bu tablo bir Hierarchyid türüyle çalışmıyor bu yüzden Bunun bir CTE ile yapılması gerekeceğinden şüpheleniyorum, ama nasıl bir ipucu yok. Bir SQL sorgusu/proc'sinde yapılabilirse, herhangi bir yardım takdir edilecektir.

Teşekkür

cevap

20

İstediğin fazla veya daha az geçerli:

-- 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; 

Referans:

Çalışma örneği:

-- 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; 

Çıktı:

1 | 0
2 | 1
3 | 2

+0

Bu harika bir şey. Yaptığım sadece çimdik son SELECT üzerinde DISTINCT yan tümce kullanmaktı. Ben çalışacağım küçük kayıt kümeleri nedeniyle performans konusunda endişelenmiyorum. Bu, yinelenenleri filtreler ve yalnızca ilk CTE sorgusunun WHERE maddesine koyduğum ölçütlere dayanarak istediğim hiyerarşileri döndürür (benim durumumda id = @childId kullanılmaz) – bcr

İlgili konular