Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Rekursives cte sql mit für Hierarchieebene

Sie haben uns nicht gesagt, woher Sie wissen, ob ein Benutzer Rechte an einer bestimmten ID hat. Das ist eine notwendige Information. Ich werde unten etwas Code einfügen, der davon ausgeht, dass Sie Ihrer Abfrage eine Spalte mit dem Namen hasRights hinzufügen und dass diese Spalte einen Nullwert hat, wenn der Benutzer keine Rechte hat, und einen Wert von eins, wenn er Rechte hat. Möglicherweise müssen Sie dies optimieren, da ich keine Daten zum Testen habe, aber hoffentlich kommen Sie damit näher.

Grundsätzlich wird die Abfrage so geändert, dass nur dann 1 zur Ebene hinzugefügt wird, wenn der Benutzer Rechte hat. Es wird auch nur dann zum Sortierpfad hinzugefügt, wenn der Benutzer Rechte hat, ansonsten wird ein leerer String angehängt. Wenn also die IDs 8 und 9 die einzigen Elemente sind, auf die der Benutzer Zugriff hat, sollten Sie die Ebenen 1 und 2 sehen und ähnliche Pfade wie „5/8/9“ statt „5/6/8/9“ sortieren. Wenn Sie immer noch nicht in der Lage sind, es zum Laufen zu bringen, würde es uns enorm helfen, wenn Sie ein Beispielschema auf SqlFiddle posten.

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