Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-多对多比特“;虚拟的;柱?_Sql_Select_Join_Projection - Fatal编程技术网

SQL-多对多比特“;虚拟的;柱?

SQL-多对多比特“;虚拟的;柱?,sql,select,join,projection,Sql,Select,Join,Projection,我有经典用户、用户角色和角色表。(任何多人关系都可能适用。) 用户和角色的PK列具有Id。角色将UserId和RoleId作为外键 如何构造这样一个SELECT查询,其中每个角色都有一个位列,位列的每个值都是用户是否拥有该角色?我知道如何在LINQ中实现这一点,但我需要在普通SQL中实现 所以,选择IsAdmin(如果我需要这样做,我应该在这里放什么?),IsModerator(也在这里?…)。。。来自用户 加入什么 任何帮助都将不胜感激。我想你指的是几个位列,而不是标志列。 我建议不要使用bi

我有经典用户、用户角色和角色表。(任何多人关系都可能适用。)

用户和角色的PK列具有Id。角色将UserId和RoleId作为外键

如何构造这样一个SELECT查询,其中每个角色都有一个位列,位列的每个值都是用户是否拥有该角色?我知道如何在LINQ中实现这一点,但我需要在普通SQL中实现

所以,选择IsAdmin(如果我需要这样做,我应该在这里放什么?),IsModerator(也在这里?…)。。。来自用户 加入什么


任何帮助都将不胜感激。

我想你指的是几个位列,而不是标志列。
我建议不要使用bit,因为您需要将它们与sum或max相加。 因此,您应该使用integer,以便不必转换/强制转换

小组:

GRP_ID
GRP_Name 
GRP_IsAdmin AS integer
GRP_IsModerator AS integer
GRP_IsGuest AS integer
T_用户

USR_ID
USR_DisplayName
USR_UserName
USR_PasswordHash
USR_PassWordSalt
USR_PassWordAlgorithm
地图用户组

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 

我知道这将如何工作,因为IsAdmin、IsModerator和IsGuest是组中的实际列,所以我们可以连接表以在结果集中获得这些值。