このクエリを、そのユーザーに関連するすべてのグループ (それらのグループのサブツリーを含む) を選択するパラメーターとして UserId を渡して呼び出すことができるビューに変換したいと思います。
実際、私は2つのテーブルを持っています:
- RoleHid フィールドの具体化されたパスを介して varchar(8000) として定義されたロール ツリーを含む「EVA_Roles」
- フィールド UserId を通じてユーザーをロールに関連付ける「EVA_UsersInRoles」
ここでの問題は、一部のロールのみが EVA_UsersInRoles テーブルのユーザーに関連している可能性があることですが、これらのロールはツリー階層内の他のロールの親である可能性があるため、ユーザーごとに複数のサブツリーを取得する必要があります。最後に、うまくいくように見えるこのクエリを思いつきましたが、ビューに変換したいと思います。もちろん、私が直面している問題は、ビューの結果をフィルター処理するために使用する UserId パラメーターがサブクエリ内にあることです。
これをビューにリファクタリングするためのヒントはありますか?
SELECT A.RoleId, E.EndDate FROM EVA_Roles A INNER JOIN EVA_Roles B ON
A.RoleHid LIKE B.RoleHid + '%' AND B.RoleHid IN (SELECT RoleHid FROM EVA_Roles C
LEFT JOIN EVA_UsersInRoles D ON C.RoleId = D.RoleId WHERE
(D.Userid = @0 OR C.RoleId = @1) AND C.ApplicationId = @2)
LEFT JOIN EVA_UsersInRoles E ON A.RoleId = E.RoleId AND E.UserId = @0 WHERE
A.ApplicationId = @2 ORDER BY A.RoleId
ビューに値を渡す必要がある場所にパラメーターを残しました。ビューでリファクタリングすることは不可能かもしれないと思います。マイクロ ORM (PetaPoco) をより使いやすい方法で利用するためだけでした。それ以外の場合は、コードで SQL を使用する必要がありますが、問題ありません。気にしないでください。
テーブル定義について:
EVA_Roles
RoleId INT - Primary Key
RoleHid VARCHAR(800) - Here I store the materialized path of the tree using nodes
ids... An example on this later.
RoleLevel INT - Security level of the role
RoleName INT - Name of the role (admin, guest, ...)
ApplicationID INT - Id of the application (in a multi app scenario)
EVA_UsersInRoles
RoleId - INT
UserId - INT
RoleHid の具体化されたパスは、このロジックに従います。RoleId 2 が RoleId 1 の子である次のデータを考えてみましょう:
RoleId 1
RoleHid "1"。
RoleId 2
RoleHid "1.2."
上記のクエリを使用すると、特定のユーザーとアプリケーションに関連付けられたすべてのサブツリーを取得できます。