sql >> Database teknologi >  >> RDS >> Sqlserver

Den nemmeste måde at lave en rekursiv selv-join på?

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

Ved at tilføje bestillingsbetingelsen kan du bevare trærækkefølgen:

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

Ved at ændre ORDER BY betingelse kan du ændre rækkefølgen af ​​søskende.



  1. Hvordan migrerer man en eksisterende Postgres-tabel til en partitioneret tabel så gennemsigtigt som muligt?

  2. Skadelige, gennemgående SQL Server-ydeevnemyter

  3. SQL DROP DATABASE Syntaks – Listet efter DBMS

  4. Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:JA) (Mysql::Fejl)