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

PostgreSQL:要素の権限を検索し、ルートまでトラバースします

    RECURSIVE CTE> このために:

    WITH RECURSIVE Perms(ID, Name, ParentID, CanRead, CanWrite, CanDelete) AS (
       SELECT i.ID, i.Name, l.LID AS ParentID, p.CanRead, p.CanWrite, p.CanDelete
       FROM Item AS i
       LEFT JOIN Permission AS p ON i.ID = p.ID
       LEFT JOIN Links AS l ON i.ID = l.ID
    ),  GET_PERMS(ID, ParentID, CanRead, CanWrite, CanDelete) AS (
        -- Anchor member: Try to get Read/Write/Delete values from Permission table
        SELECT ID, ParentID, CanRead, CanWrite, CanDelete
        FROM Perms
        WHERE ID = 3
    
      UNION ALL
    
        -- Recursive member: terminate if the previous level yielded a `NOT NULL` result
        SELECT p.ID, p.ParentID, p.CanRead, p.CanWrite, p.CanDelete
        FROM GET_PERMS AS gp 
        INNER JOIN Perms AS p ON gp.ParentID = p.ID    
        WHERE gp.CanRead IS NULL
    )
    SELECT CanRead, CanWrite, CanDelete 
    FROM GET_PERMS
    WHERE CanRead IS NOT NULL
    

    RECURSIVE CTE Permissionが発生すると終了します レコードがデータベースから取得されました。

    デモはこちら



    1. #1241-オペランドには1つの列が含まれている必要があります

    2. SQL Serverで、年、特殊文字、および順次シリーズ番号で構成される自動インクリメントの主キーIDを生成するにはどうすればよいですか?

    3. 数十年にわたって最大値を返すSQLクエリ

    4. Railsの月と年の両方でレコードをグループ化する