2013-08-20 35 views
0

我有經典的用戶,UserRoles和Roles表。 (任何多對多關係也可能適用。)SQL - 許多許多比特「虛擬」列?

用戶和角色的ID作爲其PK列。角色具有UserId和RoleId作爲外鍵。

我該如何構建這樣一個SELECT查詢,其中每個角色都有一列位,並且位列的每個值都是用戶是否具有該角色?我有一個想法如何在LINQ中做到這一點,但我需要它在普通的SQL。所以,選擇IsAdmin(如果我這是我需要做什麼?),IsModerator(這裏也是?),...從用戶 加入什麼?

任何幫助,將不勝感激。

回答

0

我asume你指的是幾個位列,而不是一個標誌列。
我建議不要使用位,因爲您需要將它們與總和或最大值一起添加。 所以你應該使用整數爲了不必轉換/轉換。

T_Groups:

GRP_ID 
GRP_Name 
GRP_IsAdmin AS integer 
GRP_IsModerator AS integer 
GRP_IsGuest AS integer 

T_Users

USR_ID 
USR_DisplayName 
USR_UserName 
USR_PasswordHash 
USR_PassWordSalt 
USR_PassWordAlgorithm 

T_MAP_Users_Groups

MAP_USRGRP_ID 
MAP_USRGRP_USR_ID 
MAP_USRGRP_GRP_ID 

查詢是這樣的:

SELECT 
    USR_ID, USR_Name 
    ,MAX(GRP_IsAdmin) AS IsAdmin 
    ,MAX(GRP_IsModerator) AS IsModerator 
    ,MAX(GRP_IsGuest) AS IsGuest 

FROM T_Users 
    LEFT JOIN T_MAP_Users_Groups 
     ON MAP_USRGRP_USR_ID = USR_ID 

    LEFT JOIN T_Groups 
     ON GRP_ID = MAP_USRGRP_GRP_ID 

GROUP BY USR_ID, USR_Name 
+0

我看到這將如何工作,因爲IsAdmin,IsModerator和IsGuest是組中的實際列,所以我們可以連接表以在結果集中獲取這些值。 –