Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Najprostszy sposób na rekurencyjne łączenie siebie?

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

Dodając warunek porządkowania, możesz zachować kolejność drzewa:

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

Zmieniając ORDER BY warunek, że możesz zmienić kolejność rodzeństwa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak włączyć wyjście RPC za pomocą T-SQL

  2. LEFT() vs SUBSTRING() w SQL Server:jaka jest różnica?

  3. Operacje CRUD programu SQL Server

  4. Jak zaktualizować z SELECT w SQL Server?

  5. Jak wysyłać wiadomości e-mail z serwera SQL (T-SQL)