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

Đệ quy cte sql với cho cấp độ phân cấp

Bạn chưa cho chúng tôi biết cách bạn biết liệu người dùng có quyền đối với một id nhất định hay không. Đó là một thông tin cần thiết. Tôi sẽ đặt một số mã bên dưới giả sử bạn thêm một cột vào truy vấn của mình có tên là hasRights và cột này sẽ có giá trị bằng 0 nếu người dùng không có quyền và giá trị là một nếu họ có. Bạn có thể cần phải chỉnh sửa điều này, vì tôi không có dữ liệu để kiểm tra nhưng hy vọng nó sẽ giúp bạn thực hiện được.

Về cơ bản, truy vấn được thay đổi để chỉ thêm 1 vào cấp nếu người dùng có quyền. Nó cũng chỉ thêm vào đường dẫn sắp xếp nếu người dùng có quyền, nếu không thì một chuỗi trống sẽ được thêm vào. Vì vậy, nếu id 8 và 9 là các mục duy nhất mà người dùng có quyền truy cập, bạn sẽ thấy cấp độ 1 và 2 và sắp xếp các đường dẫn tương tự như '5/8/9' thay vì '5/6/8/9'. Nếu bạn vẫn không thể làm cho nó hoạt động, sẽ giúp chúng tôi rất nhiều nếu bạn đăng một lược đồ mẫu lên SqlFiddle.

WITH Tree
AS (
SELECT
    id,
    parent,
    0 AS Level,
    id AS Root,
    hasRights AS HasRights,
    CAST(id AS VARCHAR(MAX)) AS Sort,
    user_id
FROM SourceTable
WHERE parent IS NULL

UNION ALL

SELECT 
    st.id,
    st.parent,
    Level + st.hasRights AS Level,
    st.parent AS Root,
    st.hasRights AS HasRights,
    uh.sort + CASE st.hasRights WHEN 0 THEN '' ELSE '/' + CAST(st.id AS VARCHAR(20)) END AS Sort,
    st.user_id
FROM SourceTable AS st
    JOIN Tree uh ON uh.id = st.parent    
)

SELECT * FROM Tree AS t
    JOIN UserTable AS ut ON  ut.id = t.user_id AND ut.user_id = '141F-4BC6-8934'
ORDER BY Sort


  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 thay đổi màu và phông chữ trong SQL Server Management Studio (SSMS) - Hướng dẫn SQL Server / TSQL Phần 12

  2. Danh sách các toán tử so sánh máy chủ SQL

  3. Khi sử dụng GETDATE () ở nhiều nơi, tốt hơn là sử dụng một biến?

  4. Sự khác biệt giữa CHAR và VARCHAR trong SQL Server là gì - Hướng dẫn sử dụng SQL Server / T-SQL Phần 31

  5. Lỗi trong SQL Server khi nhập tệp CSV mặc dù varchar (MAX) được sử dụng cho mỗi cột