sql >> データベース >  >> RDS >> Sqlserver

階層レベルの再帰cte sql

    ユーザーが特定の ID に対する権利を持っているかどうかを知る方法を教えてくれませんでした。それは必要な情報です。以下に、hasRights という列をクエリに追加することを前提としたコードをいくつか示します。 ユーザーが権限を持っていない場合、この列の値はゼロになり、権限がある場合は値が 1 になります。テストするデータがないため、これを微調整する必要があるかもしれませんが、うまくいけば、それに近づくことができます。

    基本的に、クエリは、ユーザーが権限を持っている場合にのみレベルに 1 を追加するように変更されます。また、ユーザーが権限を持っている場合にのみソート パスに追加され、そうでない場合は空の文字列が追加されます。したがって、ID 8 と 9 がユーザーがアクセスできる唯一のアイテムである場合、レベル 1 と 2 が表示され、「5/6/8/9」ではなく「5/8/9」のようなソート パスが表示されます。それでもうまくいかない場合は、サンプル スキーマを 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でsys_refcursorを使用して動的SQLを作成する方法

    2. MySQL:GROUP BYを使用する場合、空のフィールドをゼロで埋めます

    3. SQL Server のポート番号

    4. to_number()関数がPostgreSQLでどのように機能するか