2012-07-22 12 views
12

Dato un id figlio, ho bisogno di restituire una query contenente tutti i genitori di quel bambino così come i loro genitori fino a quando non arrivo al genitore di root. Ad esempio, dato questi dati:Trova in modo ricorsivo tutti gli antenati dato al bambino

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

Quindi, se ho passato in ID 5 Vorrei ottenere una query con i risultati:

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

In questa tabella non funziona con un tipo hierarchyid così Sospetto che questo dovrà essere fatto con un CTE, ma non ho idea di come. Se può essere fatto in una query/proc SQL, qualsiasi aiuto sarebbe apprezzato.

Grazie

risposta

20

Questo è più o meno ciò che si vuole:

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

Riferimento:

esempio di lavoro:

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

uscita:

1 | 0
2 | 1
3 | 2

+0

Questo è semplicemente fantastico. L'unico tweak che ho fatto è stato usare la clausola DISTINCT sulla SELECT finale. Non sono preoccupato per le prestazioni a causa dei piccoli recordset con cui lavorerò. Questo filtra i duplicati e restituisce solo le gerarchie che voglio, in base ai criteri che ho inserito nella clausola WHERE della prima query CTE (non usando id = @childId nel mio caso) – bcr

Problemi correlati