Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cte sql rekursif dengan untuk level hierarki

Anda belum memberi tahu kami bagaimana Anda tahu apakah pengguna memiliki hak atas id yang diberikan. Itu adalah informasi yang diperlukan. Saya akan meletakkan beberapa kode di bawah ini yang mengasumsikan Anda menambahkan kolom ke kueri Anda yang disebut hasRights dan kolom ini akan memiliki nilai nol jika pengguna tidak memiliki hak dan nilai satu jika memiliki hak. Anda mungkin perlu mengubah ini, karena saya tidak memiliki data untuk diuji, tetapi mudah-mudahan ini akan membuat Anda dekat.

Pada dasarnya, kueri diubah menjadi hanya menambahkan 1 ke level jika pengguna memiliki hak. Itu juga hanya menambah jalur pengurutan jika pengguna memiliki hak, jika tidak, string kosong akan ditambahkan. Jadi, jika id 8 dan 9 adalah satu-satunya item yang dapat diakses pengguna, Anda akan melihat level 1 dan 2 dan mengurutkan jalur yang mirip dengan '5/8/9' daripada '5/6/8/9'. Jika Anda masih tidak bisa membuatnya bekerja, itu akan sangat membantu kami jika Anda memposting contoh skema di 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. Apakah saya memerlukan objek Layanan?

  2. Menghasilkan Script untuk Catatan Tertentu di SQL Server

  3. sql pivot dengan kolom dinamis

  4. Salin indeks secara terprogram dari satu tabel ke tabel lainnya di SQL Server

  5. datetime vs smalldatetime di SQL Server:Apa Bedanya?