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

Дървовидна йерархия на SQL Server и вложени набори с дублирани идентификатори на записи

Ето един, който върши работа за мен:

@ParentID е само начална точка в йерархията, но можете да подадете 0 (но мисля, че използвате null като основен идентификатор, така че ще схванете идеята)

Ключът към подреденото сортиране е с изградения ключ за сортиране.

WITH RoleHierarchy (RoleID, [Role], [Description], ParentID, Editable, HierarchyLevel, SortKey) AS
(
   -- Base
   SELECT
        RoleID,
        [Role],
        [Description],
        ParentID,
        Editable,
        0 as HierarchyLevel,
        CAST(RoleID AS VARBINARY(300))
   FROM
        dbo.Roles       
   WHERE
        RoleID = @ParentID

   UNION ALL

   -- Recursive
   SELECT
        e.RoleID,
        e.[Role],
        e.[Description],
        e.ParentID,
        e.Editable,
        th.HierarchyLevel + 1 AS HierarchyLevel,
        CAST (th.SortKey + CAST (e.[Role] AS VARBINARY(100)) + CAST (e.[RoleID] AS VARBINARY(100)) AS VARBINARY(300))
   FROM
        Roles e
        INNER JOIN RoleHierarchy th ON e.ParentID = th.RoleID
    WHERE
        e.RoleID != 0
)

SELECT
    RoleID,
    ParentID,
    [Role],
    [Description],
    Editable,
    HierarchyLevel
FROM
    RoleHierarchy
WHERE
    RoleID != @ParentID
ORDER BY
    SortKey


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо моето ляво съединение не връща нули?

  2. MSSQL Редовен израз

  3. SQL Server - подслушване на параметри

  4. Има ли начин за преглед на последните скъпи заявки в Sql Server 2005?

  5. SQL Server:Как да извикам дефинирана от потребителя функция (UDF) на свързан сървър?