2013-09-27 3 views
7

Ich habe folgende Daten in der Datenbank:bekommen alle Kinder eines Elternteils mit MSSQL Abfrage

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

Mein Parameter 106 und mit dem Parameter ich alle anderen Kinder unter ihrer Eltern abrufen möchten die ist 101. Ich habe versucht, die rekursive Methode, aber es hat nicht funktioniert, angesichts der folgenden Daten. Gibt es eine andere Möglichkeit, eine Abfrage zu formulieren?

Antwort

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

Eine kleine Erklärung mit dem Code ist immer nett. –

14

Angenommen, Sie Geschwister des Wertes @p0 erhalten möchten, können Sie eine einfache verwenden 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 

Der Ungleich-Klausel hier stellt sicher, dass Sie bekommen Geschwister nicht einschließlich der Wert, nach dem Sie gesucht haben. Entfernen Sie es wie nötig.

SQL Fiddle example


Da Sie aber Rekursion erwähnen, vielleicht wollen Sie den gesamten Baum@p0 des Wertes der Mutter beginnen. In diesem Fall können Sie eine rekursive CTE verwenden:

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 Beispiele using your data und with additional data to demonstrate the recursive CTE

+1

Ich habe die erste Frage bedankt danke – waine

+0

Geschwister? Aber er schrieb "Alle * die ** Kinder ** eines Elternteils bekommen ..." Wie kann ich den ganzen Unterbaum eines gegebenen Wertes (Eltern) - Wurzel eines Unterbaums bekommen? – candlejack

+0

@alessadro und per Definition die anderen Kinder deiner Eltern sind deine Geschwister? –

-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