sql >> Databáze >  >> RDS >> Sqlserver

Rekurzivní cte sql s pro úroveň hierarchie

Neřekli jste nám, jak víte, zda má uživatel práva k danému ID. To je nezbytná informace. Níže vložím kód, který předpokládá, že do dotazu přidáte sloupec s názvem hasRights a že tento sloupec bude mít nulovou hodnotu, pokud uživatel nemá práva, a hodnotu jedna, pokud má. Možná to budete muset vyladit, protože nemám žádná data k testování, ale doufám, že vás to přiblíží.

V zásadě je dotaz změněn tak, aby přidal pouze 1 k úrovni, pokud má uživatel práva. Také přidává do cesty řazení pouze v případě, že má uživatel práva, jinak se připojí prázdný řetězec. Pokud jsou tedy id 8 a 9 jediné položky, ke kterým má uživatel přístup, měli byste vidět úrovně 1 a 2 a seřadit cesty podobné '5/8/9' spíše než '5/6/8/9'. Pokud se vám to stále nedaří zprovoznit, nesmírně by nám pomohlo, kdybyste na SqlFiddle zveřejnili ukázkové schéma.

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. Integrace nástrojů pro správu PostgreSQL v produkci

  2. Jak najdu druhý největší plat z tabulky zaměstnanců?

  3. Odečtěte dny od data v SQLite

  4. Mapujte bodové pole geometrie PostGIS pomocí Hibernate na Spring Boot