Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Rekurencyjne cte sql z poziomem hierarchii

Nie powiedziałeś nam, skąd wiesz, czy użytkownik ma prawa do danego identyfikatora. To niezbędna informacja. Zamieszczę poniżej kod, który zakłada, że ​​dodajesz do zapytania kolumnę o nazwie hasRights i że ta kolumna będzie miała wartość zerową, jeśli użytkownik nie ma uprawnień, a wartość równą, jeśli ma. Być może będziesz musiał to poprawić, ponieważ nie mam danych do przetestowania, ale mam nadzieję, że zbliżysz się do tego.

Zasadniczo zapytanie jest zmieniane tak, aby dodać tylko 1 do poziomu, jeśli użytkownik ma uprawnienia. Dodaje również do ścieżki sortowania tylko wtedy, gdy użytkownik ma uprawnienia, w przeciwnym razie dodawany jest pusty ciąg. Jeśli więc identyfikatory 8 i 9 są jedynymi elementami, do których użytkownik ma dostęp, powinieneś zobaczyć poziomy 1 i 2 oraz posortować ścieżki podobne do „5/8/9” zamiast „5/6/8/9”. Jeśli nadal nie możesz go uruchomić, ogromnie pomogłoby nam opublikowanie przykładowego schematu na 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. Jak mogę uruchomić tylko instrukcję, na której znajduje się mój kursor w SQL Server Management Studio?

  2. Wewnętrzne siedem sortowań SQL Server – część 2

  3. Jak dynamicznie mapować kolumny wejściowe i wyjściowe w SSIS?

  4. Jak wybrać tylko część ogromnego pliku binarnego (pliku)?

  5. Ponowne użycie SqlCommand?