sql >> Databasteknik >  >> RDS >> Sqlserver

Rekursiv cte sql med för hierarkinivå

Du har inte berättat för oss hur du vet om en användare har rättigheter till ett givet id. Det är en nödvändig information. Jag ska lägga in lite kod nedan som förutsätter att du lägger till en kolumn i din fråga som heter hasRights och att denna kolumn kommer att ha ett nollvärde om användaren inte har rättigheter och ett värde på ett om de har det. Du kan behöva justera detta, eftersom jag inte har några data att testa med men förhoppningsvis kommer det dig nära.

I grund och botten ändras frågan till att bara lägga till 1 till nivån om användaren har rättigheter. Det läggs också bara till i sorteringsvägen om användaren har rättigheter, annars läggs en tom sträng till. Så, om id 8 och 9 är de enda objekten som användaren har tillgång till, bör du se nivåerna 1 och 2 och sortera sökvägar som liknar '5/8/9' snarare än '5/6/8/9'. Om du fortfarande inte kan få det att fungera skulle det hjälpa oss enormt om du postade ett exempelschema 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. Hur man kopierar en rad från en SQL Server-tabell till en annan

  2. Gruppering efter kolumn med beroende av en annan kolumn

  3. Problem med tabellvärdesparameterprestanda

  4. mysql_fetch_array returnerar endast en rad