【问题标题】:SQL - Many-Many To Bit "Virtual" Columns?SQL - 多对多位“虚拟”列?
【发布时间】:2013-08-20 21:58:40
【问题描述】:

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

User 和 Role 将 Id 作为其 PK 列。 Roles 有 UserId 和 RoleId 作为外键。

如何构造这样一个 SELECT 查询,其中每个角色都有一个位列,位列的每个值是用户是否具有角色?我知道如何在 LINQ 中执行此操作,但我需要使用普通 SQL。

所以,SELECT IsAdmin(如果我需要这样做,我应该把什么放在这里?),IsModerator(也放在这里?),... FROM Users 加入什么?

任何帮助将不胜感激。

【问题讨论】:

    标签: sql select join projection


    【解决方案1】:

    我假设您的意思是几个位列,而不是标志列。
    我建议不要使用 bit,因为您需要将它们与 sum 或 max 相加。 所以你应该使用整数,以便不必转换/转换。

    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 
    

    【讨论】:

    • 我知道这将如何工作,因为 IsAdmin、IsModerator 和 IsGuest 是 Group 中的实际列,因此我们可以连接表以在结果集中获取这些值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2021-08-11
    • 2015-11-21
    • 2015-09-24
    相关资源
    最近更新 更多