Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Най-простият начин да направите рекурсивно самоприсъединяване?

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

Като добавите условието за подреждане, можете да запазите дървовидния ред:

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

Чрез промяна на ORDER BY условие можете да промените подредбата на братята и сестрите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:Прикачете неправилна версия 661

  2. Изхвърлете всички таблици, съхранени процедури, тригери, ограничения и всички зависимости в един оператор sql

  3. Оптимален начин за конкатенация/обединяване на низове

  4. Променете езика за текущата сесия в SQL Server

  5. Какви са различните типове ограничения, налични в SQL Server - SQL Server / T-SQL урок, част 50