Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Abrufen aller untergeordneten Elemente eines übergeordneten Elements mithilfe einer MSSQL-Abfrage

Angenommen, Sie möchten Geschwister bekommen des Wertes @p0 , können Sie einen einfachen Self-Join verwenden:

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

Die ungleiche Klausel hier stellt sicher, dass Sie Geschwister erhalten, die nicht den gesuchten Wert enthalten. Entfernen Sie es bei Bedarf.

SQL-Fiddle-Beispiel

Da Sie jedoch Rekursion erwähnen, möchten Sie vielleicht den gesamten Baum beginnend beim Elternteil des Werts @p0 . In diesem Fall können Sie einen rekursiven 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 unter Verwendung Ihrer Daten und mit zusätzlichen Daten zur Demonstration des rekursiven CTE