2013-09-27 75 views
7

Mam następujące dane w mojej bazy danych:uzyskanie wszystkich dzieci rodzica przy użyciu MSSQL zapytanie

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

Moja parametr 106. A za pomocą parametru Chcę pobrać wszystkie inne dzieci w jego rodzica, który jest 101. Próbowałem użyć metody rekurencyjnej, ale nie działało, biorąc pod uwagę następujące dane. Czy istnieje inny sposób sformułowania zapytania?

Odpowiedz

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

Małe wyjaśnienie z kodem jest zawsze miłe. –

14

Zakładając chcesz dostać rodzeństwo wartości @p0, można użyć prostego samosprzężenie:

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

nie-równe klauzula tutaj sprawia, że ​​masz rodzeństwo nie licząc wartość, której szukałeś. W razie potrzeby usuń.

SQL Fiddle example


Skoro wspomniałeś rekursji choć może chcesz całego drzewa zaczynając od rodzica wartości @p0. W takim przypadku można użyć rekurencyjnej CTE:

przykłady
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 using your data i with additional data to demonstrate the recursive CTE

+1

Użyłem pierwszego zapytania dziękuję rodzeństwo – waine

+0

? Ale napisał "Pierwsze * wszystkie * ** dzieci ** rodzica ..." Jak mogę uzyskać wszystkie sub-drzewa danej wartości (rodzic) - root z drzewa podrzędnego? – candlejack

+0

@alessadro i z definicji inne twoje dzieci rodzica są twoim rodzeństwem? –

-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