1

私はこれらのテーブルを持っています

ユーザー

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

要件:

  1. 提供された に従って、そのページのPageプラスRead, Write, Deleteからすべてを選択するクエリ。Permission@User_Id
  2. が渡されない場合@User_Idは、すべてのページをnullinで選択する必要がありますRead, Write, Delete
  3. 提供され@User_Idた が存在しないPermission場合は、Read, Write, Deleteとして選択する必要がありますnull
  4. permissionすべてではなく一部のレコードが にpages関連付けられている場合があります。userその場合、 のすべてのレコードがpages表示され、関連付けられていないページのレコードuser_idが列に表示さnullRead, 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、これを解決する他の方法があるかどうかを知りたいです。

4

1 に答える 1

2

@User_Id int=null を宣言します。

SELECT 
    page.Page_Name,
    page.Page_Id,
    ISNULL(Read,0) AS Read
    ISNULL(Write,0) AS Write,
    ISNULL(Delete,0) AS Delete,
    ISNULL(Export,0) AS Export
FROM 
    Page
    LEFT JOIN Permission ON Page.Page_ID = Permission.Page_ID AND Permission.User_ID = @User_ID

@userID パラメーターでも結合すると、null の場合、アクセス許可のどの行とも一致しないため、値は NULL になります。

于 2012-10-08T13:08:37.923 に答える