Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Cte sql recursivo com nível de hierarquia


Você não nos disse como sabe se um usuário tem direitos sobre um determinado ID. Essa é uma informação necessária. Vou colocar um código abaixo que pressupõe que você adicione uma coluna à sua consulta chamada hasRights e que esta coluna terá valor zero se o usuário não tiver direitos e valor um se tiver. Você pode precisar ajustar isso, já que não tenho dados para testar, mas espero que chegue perto.

Basicamente, a consulta é alterada para adicionar apenas 1 ao nível se o usuário tiver direitos. Ele também só adiciona ao caminho de classificação se o usuário tiver direitos, caso contrário, uma string vazia será anexada. Portanto, se os IDs 8 e 9 forem os únicos itens aos quais o usuário tem acesso, você deverá ver os níveis 1 e 2 e classificar caminhos semelhantes a '5/8/9' em vez de '5/6/8/9'. Se você ainda não conseguir fazê-lo funcionar, nos ajudaria tremendamente se você postasse um esquema de amostra no 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