2013-08-20 10 views
0

У меня есть классические таблицы пользователей, UserRoles и Roles. (Возможно, будут применяться и многие отношения многих).SQL - много-много бит «виртуальных» столбцов?

Пользователь и роль имеют идентификатор в качестве столбца PK. Роли имеют UserId и RoleId как внешние ключи.

Как бы я построил такой запрос SELECT, где у меня есть бит столбца для каждой роли, и каждое значение столбцов бит является ли роль пользователя? У меня есть идея, как это сделать в LINQ, но мне это нужно в простом SQL.

Итак, SELECT IsAdmin (Что я здесь делаю, если это то, что мне нужно делать?), IsModerator (здесь тоже?), ... FROM Users ПРИСОЕДИНЯЙТЕСЬ ЧТО?

Любая помощь будет оценена по достоинству.

ответ

0

Я предполагаю, что вы имеете в виду несколько бит столбцов, а не столбец флагов.
Я бы посоветовал использовать бит, потому что вам нужно добавить их вместе с суммой или макс. Итак, вы должны использовать целое число, чтобы не конвертировать/отличать.

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 являются фактическими столбцами в группе, поэтому мы могли бы присоединиться к таблицам, чтобы получить эти значения в наборе результатов. –