sql >> Database >  >> RDS >> Sqlserver

Recursieve cte sql met voor hiërarchieniveau

Je hebt ons niet verteld hoe je weet of een gebruiker rechten heeft op een bepaalde id. Dat is een noodzakelijke informatie. Ik ga hieronder wat code plaatsen die ervan uitgaat dat je een kolom aan je zoekopdracht toevoegt met de naam hasRights en dat deze kolom een ​​waarde nul heeft als de gebruiker geen rechten heeft en een waarde van één als ze dat wel hebben. Het kan zijn dat je dit moet aanpassen, omdat ik geen gegevens heb om mee te testen, maar hopelijk kom je er dichtbij.

In principe wordt de zoekopdracht gewijzigd om alleen 1 toe te voegen aan het niveau als de gebruiker rechten heeft. Het voegt ook alleen toe aan het sorteerpad als de gebruiker rechten heeft, anders wordt er een lege string toegevoegd. Dus als id's 8 en 9 de enige items zijn waartoe de gebruiker toegang heeft, zou u niveaus 1 en 2 moeten zien en sorteerpaden vergelijkbaar met '5/8/9' in plaats van '5/6/8/9'. Als het je nog steeds niet lukt om het werkend te krijgen, zou het ons enorm helpen als je een voorbeeldschema op SqlFiddle zou plaatsen.

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. Android SQLite-fout:het variabelenummer moet tussen ?1 en ?999 . liggen

  2. kan geen afbeelding uploaden op MySQL die is verbonden met de Google Cloud-app-engine in Laravel

  3. mysql is dood maar subsys vergrendeld

  4. Hoe een postgres-database naar sqlite te converteren?