Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cấu trúc phân cấp cây máy chủ SQL và bộ lồng nhau với id bản ghi trùng lặp

Đây là một trong những thủ thuật phù hợp với tôi:

@ParentID chỉ là một điểm bắt đầu trong hệ thống phân cấp, nhưng bạn có thể chuyển bằng 0 (nhưng tôi nghĩ bạn đang sử dụng null làm ID cơ sở, vì vậy bạn sẽ có ý tưởng)

Chìa khóa để sắp xếp theo thứ tự là với khóa sắp xếp đã được tích hợp sẵn.

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. Cách sử dụng RANK () trong SQL Server

  2. Cách gửi một email HTML từ SQL Server (T-SQL)

  3. Tạo cơ sở dữ liệu mới từ bản sao lưu của một Cơ sở dữ liệu khác trên cùng một máy chủ?

  4. Lỗi chuyển đổi khi chuyển đổi 'nvarchar' thành 'datetime' trong máy chủ sql

  5. Hiểu tầm quan trọng của cài đặt bộ nhớ trong SQL Server