sql >> Databasteknik >  >> RDS >> Sqlserver

Enklaste sättet att göra en rekursiv självanslutning?

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

Genom att lägga till beställningsvillkoret kan du bevara trädordningen:

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

Genom att ändra ORDER BY skick du kan ändra ordningen på syskonen.



  1. Den serialiserbara isoleringsnivån

  2. Datagenerering och hårdvarukvalitet

  3. Vad är Oracles datumformateringsmask för tidszoner?

  4. MERGE:Uppdatering av käll- och måltabeller som finns på separata servrar