私はこれらのテーブルを持っています
ユーザー
User_Id int PK, User_Name varchar(50)
ページ
Page_Id int PK, Page_Name varchar(50)
許可
Permission_Id int PK , User_Id int FK, Page_Id int FK,
Read bit, Write bit, Delete bit
要件:
- 提供された に従って、そのページの
Page
プラスRead, Write, Delete
からすべてを選択するクエリ。Permission
@User_Id
- が渡されない場合
@User_Id
は、すべてのページをnull
inで選択する必要がありますRead, Write, Delete
。 - 提供され
@User_Id
た が存在しないPermission
場合は、Read, Write, Delete
として選択する必要がありますnull
。 permission
すべてではなく一部のレコードが にpages
関連付けられている場合があります。user
その場合、 のすべてのレコードがpages
表示され、関連付けられていないページのレコードuser_id
が列に表示さnull
れRead, Write, Delete
ます。
私がやったことはこれです
declare @User_Id int=null;
SELECT
page.Page_Name,
page.Page_Id,
isnull((select Read from Permission where
(@User_Id is null OR User_Id = @User_Id ) and
(Permission.Page_Id = Page.Page_Id)),0)
as Read,
isnull((select Write from Permission where
(@User_Id is null OR User_Id = @User_Id) and
(Permission.Page_Id = Page.Page_Id)),0)
as Write,
isnull((select Delete from Permission where
(@User_Id is null OR User_Id = @User_Id) and
(Permission.Page_Id = Page.Page_Id)),0)
as Delete,
isnull((select Export from Permission where
(@User_Id is null OR User_Id = @User_Id) and
(Permission.Page_Id = Page.Page_Id)), 0)
as Export
FROM Page
このクエリは正常に機能し、すべての要件を満たしていますがsub queries
、削除したいものがあることがわかるように、1 つのオプションが考えられますがsql functions
、これを解決する他の方法があるかどうかを知りたいです。