如何在Access中向参数传递多个值?

Sea*_*een 5 sql parameters excel ms-access

背景/总体目标

  • 我有一个 Excel 电子表格,其中列出了某些角色需要测试的项目。
    • 角色有成员
    • 角色可以有成员角色,成员角色有自己的用户。
  • 我需要获取可以测试给定功能的用户总数,以获取名称并计算某些指标的数量。
  • 我将用户、角色和成员角色放入 Access DB 中以进行快速查询
  • 现在,只是想获取正确的信息。我不介意输入角色列表并让它以这种方式返回内容。
  • 我想避免将每个角色的所有测试项目添加到数据库中(其中有很多测试项目,这应该是一个相当快的任务)。

数据库结构

                       +---------------+
    +------------+     |RolesUsers     |
    |Roles       |     |---------------|    +---------------+
    |+-----------|     |ID             |    |Users          |
 +-+|ID          |+---+|RoleID         |    |---------------|
 |  |RoleName    |     |UserID         |+--+|ID             |
 |  +------------+     +---------------+    |UserName       |
 |                                          +---------------+
 |
 |  +-----------------+
 |  |RolesMemberRoles |
 |  |-----------------|
 |  |ID               |
 +-+|RoleID           |
 +-+|MemberRoleID     |
    +-----------------+
Run Code Online (Sandbox Code Playgroud)

目标

  • 将角色列表传递给查询(通过列出的参数或字符串列表)
  • 返回属于任何这些角色或其任何成员角色的唯一用户的计数
  • 快速而肮脏——不一定要花哨

当前访问查询

  • 返回属于通过参数输入的给定角色的角色或其成员角色的用户
PARAMETERS p_RoleName Text ( 255 );
SELECT Roles.RoleName, Users.UserName
FROM 

(RolesUsers INNER JOIN Users ON RolesUsers.UserID = Users.ID) 
INNER JOIN Roles ON RolesUsers.RoleID = Roles.ID

Where RolesUsers.RoleID In (Select ID from Roles where Roles.RoleName = p_RoleName)

UNION SELECT Roles.RoleName, Users.UserName
FROM 

(RolesUsers INNER JOIN Users ON RolesUsers.UserID = Users.ID) 
INNER JOIN Roles ON RolesUsers.RoleID = Roles.ID

Where RolesUsers.RoleID IN (
SELECT RolesSubroles.SubRoleID FROM RolesSubroles INNER JOIN Roles ON RolesSubRoles.RoleID = Roles.ID 
where Roles.RoleName = p_RoleName);
Run Code Online (Sandbox Code Playgroud)

到目前为止的想法

  • 发现一篇有趣的文章,介绍如何使用 Instr() 将文本字符串传递到 where 子句。但不确定我如何才能根据我的情况进行调整。

gan*_*een 1

WHERE为了实现目标 1,您可以使用 Remou 上面的建议,通过以下查询在子句中键入 RoleName 列表。但是,删除“WHERE”子句、运行查询,然后粘贴到 Excel 中进行(目标 3)“快速而肮脏”的过滤可能更有意义。

SELECT DISTINCT Roles_1.RoleName,
            Users.UserName
FROM   Users
   INNER JOIN ((Roles
                INNER JOIN (RolesMemberRoles
                            INNER JOIN Roles AS Roles_1
                              ON RolesMemberRoles.MemberRoleID = Roles_1.ID)
                  ON Roles.ID = RolesMemberRoles.RoleID)
               INNER JOIN RoleUsers
                 ON Roles.ID = RoleUsers.RoleID)
     ON Users.ID = RoleUsers.UserID
WHERE  Roles_1.RoleName In ( "Prez", "Veep", "Staffer" )
ORDER  BY Roles_1.RoleName,
      Users.UserName;  
Run Code Online (Sandbox Code Playgroud)

要返回能够履行各种角色(目标 2)的用户数量,您可以运行以下命令。

SELECT InheritedRoles.RoleName,
   Count(*) AS NumOfTestersAvailable
FROM   (SELECT DISTINCT Roles_1.RoleName,
                    Users.UserName
    FROM   Users
           INNER JOIN ((Roles
                        INNER JOIN (RolesMemberRoles
                                    INNER JOIN Roles AS Roles_1
                                      ON RolesMemberRoles.MemberRoleID =
                                   Roles_1.ID)
                          ON Roles.ID = RolesMemberRoles.RoleID)
                       INNER JOIN RoleUsers
                         ON Roles.ID = RoleUsers.RoleID)
             ON Users.ID = RoleUsers.UserID) AS InheritedRoles
GROUP  BY InheritedRoles.RoleName
ORDER BY InheritedRoles.RoleName;  
Run Code Online (Sandbox Code Playgroud)

上面的 SQL 假定每个 Role 都将其自身作为 RoleMemberRoles 表中的 Member 包含。您应该使用它DISTINCT,因为数据模型不会阻止单个用户拥有多个角色,从而在每个结果集中多次出现。