sql >> Database teknologi >  >> RDS >> Sqlserver

Rekursiv cte sql med for hierarkiniveau

Du har ikke fortalt os, hvordan du ved, om en bruger har rettigheder til et givet id. Det er en nødvendig oplysning. Jeg vil indsætte noget kode nedenfor, der antager, at du tilføjer en kolonne til din forespørgsel kaldet hasRights og at denne kolonne vil have en værdi på nul, hvis brugeren ikke har rettigheder, og en værdi på én, hvis de har. Du skal muligvis justere dette, da jeg ikke har nogen data at teste med, men forhåbentlig vil det bringe dig tæt på.

Grundlæggende ændres forespørgslen til kun at tilføje 1 til niveauet, hvis brugeren har rettigheder. Det tilføjer også kun sorteringsstien, hvis brugeren har rettigheder, ellers tilføjes en tom streng. Så hvis id 8 og 9 er de eneste elementer, brugeren har adgang til, bør du se niveauer 1 og 2 og sortere stier svarende til '5/8/9' i stedet for '5/6/8/9'. Hvis du stadig ikke er i stand til at få det til at fungere, ville det hjælpe os enormt, hvis du postede et eksempelskema på 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

  1. Oracle RAC og sekvenser

  2. Sådan fungerer Date()-funktionen i SQLite

  3. Hvad er forskellene mellem utf8_general_ci og utf8_unicode_ci?

  4. Samlet strengsammenkædning i Oracle 10g