sql >> Base de Datos >  >> RDS >> Sqlserver

cte sql recursivo con nivel de jerarquía

No nos ha dicho cómo sabe si un usuario tiene derechos sobre una identificación determinada. Ese es un dato necesario. Voy a poner un código debajo que asume que agregas una columna a tu consulta llamada hasRights y que esta columna tendrá valor cero si el usuario no tiene derechos y valor uno si los tiene. Es posible que deba modificar esto, ya que no tengo datos para probar, pero espero que lo acerque.

Básicamente, la consulta se modifica para agregar solo 1 al nivel si el usuario tiene derechos. También solo se agrega a la ruta de clasificación si el usuario tiene derechos; de lo contrario, se agrega una cadena vacía. Por lo tanto, si los ID 8 y 9 son los únicos elementos a los que el usuario tiene acceso, debería ver los niveles 1 y 2 y ordenar rutas similares a '5/8/9' en lugar de '5/6/8/9'. Si aún no puede hacerlo funcionar, nos sería de gran ayuda si publicara un esquema de muestra en 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