Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

cte sql récursif avec pour le niveau de hiérarchie

Vous ne nous avez pas dit comment vous savez si un utilisateur a des droits sur un identifiant donné. C'est une information nécessaire. Je vais mettre un code ci-dessous qui suppose que vous ajoutez une colonne à votre requête appelée hasRights et que cette colonne aura une valeur nulle si l'utilisateur n'a pas de droits et une valeur de un s'il en a. Vous devrez peut-être modifier cela, car je n'ai pas de données à tester, mais j'espère que cela vous rapprochera.

Fondamentalement, la requête est modifiée pour n'ajouter 1 au niveau que si l'utilisateur a des droits. Il ajoute également au chemin de tri uniquement si l'utilisateur a des droits, sinon une chaîne vide est ajoutée. Ainsi, si les identifiants 8 et 9 sont les seuls éléments auxquels l'utilisateur a accès, vous devriez voir les niveaux 1 et 2 et trier les chemins similaires à "5/8/9" plutôt qu'à "5/6/8/9". Si vous ne parvenez toujours pas à le faire fonctionner, cela nous aiderait énormément si vous postiez un exemple de schéma sur 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