2012-07-22 30 views
12

Với một id con, tôi cần trả về một truy vấn chứa tất cả các bậc cha mẹ của đứa trẻ đó cũng như cha mẹ của chúng cho đến khi tôi đến cha mẹ gốc. Ví dụ, đưa ra các dữ liệu này:Đệ quy tìm tất cả tổ tiên cho trẻ

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

Vì vậy, nếu tôi được thông qua vào ID 5 Tôi muốn để có được một truy vấn với kết quả:

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

Bảng này không làm việc với một loại HierarchyId nên Tôi nghi ngờ rằng điều này sẽ cần phải được thực hiện với một CTE, nhưng không có đầu mối như thế nào. Nếu nó có thể được thực hiện trong một truy vấn SQL/proc, bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Cảm ơn

Trả lời

20

này là nhiều hơn hoặc ít hơn những gì bạn muốn:

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

tham khảo:

dụ làm việc:

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

Output:

1 | 0
2 | 1
3 | 2

+0

Điều này thật tuyệt vời. Tinh chỉnh duy nhất tôi thực hiện là sử dụng mệnh đề DISTINCT trên SELECT cuối cùng. Tôi không lo lắng về hiệu suất do các tập bản ghi nhỏ mà tôi sẽ làm việc. Điều này lọc ra các bản sao và chỉ trả về các thứ bậc mà tôi muốn, dựa trên các tiêu chí tôi đặt trong mệnh đề WHERE của truy vấn CTE đầu tiên (không sử dụng id = @childId trong trường hợp của tôi) – bcr

Các vấn đề liên quan