sql >> Databáze >  >> RDS >> Sqlserver

Nejjednodušší způsob, jak provést rekurzivní vlastní spojení?

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

Přidáním podmínky řazení můžete zachovat stromové pořadí:

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

Změnou ORDER BY podmínkou můžete změnit pořadí sourozenců.



  1. PostgreSQL Column neexistuje, ale ve skutečnosti existuje

  2. Jak provést mysqldump bez výzvy k zadání hesla?

  3. Ruby on Rails 3 Nelze se připojit k místnímu serveru MySQL přes socket '/tmp/mysql.sock' na OSX

  4. TABLOCK vs TABLOCKX