2013-09-27 18 views
7

ho i seguenti dati nel mio database:Come tutti i figli di un genitore utilizzando Query MSSQL

Parent  Child 
101   102 
101   103 
101   104 
101   105 
101   106 

mio parametro è 106. E utilizzando il parametro che voglio recuperare tutti gli altri bambini di età inferiore sua madre che è 101. Ho provato a utilizzare il metodo ricorsivo ma non ha funzionato dati i seguenti dati. C'è un altro modo per formulare una query?

risposta

-1
select child 
from my_table T1 
where exists (select 1 from my_table T2 where child = @parameter and T1.parent = T2.parent) 
+6

Una piccola spiegazione con il codice è sempre carina. –

14

Supponendo che si desidera ottenere fratelli del valore @p0, è possibile utilizzare un semplice self-join:

SELECT p.Child 
FROM Table1 c 
INNER JOIN Table1 p ON c.Parent = p.Parent 
WHERE c.Child = @p0 
AND p.Child <> @p0 

La clausola di non-uguali qui fa in modo che si ottiene fratelli non tra cui il valore che hai cercato Rimuoverlo se necessario.

SQL Fiddle example


Dal momento che si parla di ricorsione, però, forse si desidera che il intero albero partendo dal genitore del valore @p0. In questo caso, è possibile utilizzare una CTE ricorsiva:

WITH parent AS (
    SELECT Parent 
    FROM Table1 
    WHERE Child = @p0 
), tree AS (
    SELECT x.Parent, x.Child 
    FROM Table1 x 
    INNER JOIN parent ON x.Parent = parent.Parent 
    UNION ALL 
    SELECT y.Parent, y.Child 
    FROM Table1 y 
    INNER JOIN tree t ON y.Parent = t.Child 
) 
SELECT Parent, Child 
FROM tree 

SQL Fiddle esempi using your data e with additional data to demonstrate the recursive CTE

+1

ho usato la prima query grazie fratelli – waine

+0

? Ma ha scritto "Ottenere * tutti * i ** figli ** di un genitore ..." Come posso ottenere tutto il sotto-albero di un dato valore (genitore) - radice di un sotto-albero? – candlejack

+0

@alessadro e per definizione gli altri figli dei tuoi genitori sono tuoi fratelli? –

-1
WITH parent AS (
    SELECT Parent 
    FROM Table1 
    WHERE Child = @p0 
), tree AS (
    SELECT x.Parent, x.Child 
    FROM Table1 x 
    INNER JOIN parent ON x.Parent = parent.Parent 
    UNION ALL 
    SELECT y.Parent, y.Child 
    FROM Table1 y 
    INNER JOIN tree t ON y.Parent = t.Child 
) 
SELECT Parent, Child 
FROM tree