sql >> Database >  >> RDS >> Sqlserver

De eenvoudigste manier om een ​​recursieve self-join te doen?

WITH    q AS 
        (
        SELECT  *
        FROM    mytable
        WHERE   ParentID IS NULL -- this condition defines the ultimate ancestors in your chain, change it as appropriate
        UNION ALL
        SELECT  m.*
        FROM    mytable m
        JOIN    q
        ON      m.parentID = q.PersonID
        )
SELECT  *
FROM    q

Door de bestelvoorwaarde toe te voegen, kunt u de boomvolgorde behouden:

WITH    q AS 
        (
        SELECT  m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
        FROM    mytable m
        WHERE   ParentID IS NULL
        UNION ALL
        SELECT  m.*,  q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN
        FROM    mytable m
        JOIN    q
        ON      m.parentID = q.PersonID
        )
SELECT  *
FROM    q
ORDER BY
        bc

Door de ORDER BY . te wijzigen voorwaarde kunt u de volgorde van de broers en zussen wijzigen.



  1. Veelgebruikte database-infrastructuurpatronen vergelijken

  2. Een tijdelijke tabel maken in SQL Server

  3. Beveiligingsoverwegingen voor MariaDB-implementaties in een hybride cloudomgeving

  4. SqlConnection SqlCommand SqlDataReader IDisposable