sql >> Database >  >> RDS >> Sqlserver

Alle kinderen van een ouder ophalen met MSSQL-query

Ervan uitgaande dat je broers en zussen wilt krijgen van de waarde @p0 , kunt u een eenvoudige self-join gebruiken:

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

De niet-gelijkwaardige clausule hier zorgt ervoor dat je broers en zussen krijgt die niet de waarde bevatten waarnaar je hebt gezocht. Verwijder het indien nodig.

SQL Fiddle-voorbeeld

Aangezien je echter recursie noemt, wil je misschien de hele boom beginnend bij de ouder van de waarde @p0 . In dat geval kunt u een recursieve CTE gebruiken:

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

Voorbeelden van SQL Fiddle het gebruik van uw gegevens enmet aanvullende gegevens om de recursieve CTE aan te tonen



  1. taps migratie mislukt van sqlite naar postgres rails4, ruby ​​1.9.3

  2. invoer in meerdere tabellen in php . invoegen

  3. de MySQL-service op de lokale computer is gestart en vervolgens gestopt

  4. (-) streepje gebruiken in mysql-tabelnaam