如何将多个值传递给Access中的参数?

时间:2011-11-30 15:47:27

标签: sql excel ms-access parameters

背景/总体目标

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

数据库结构

                       +---------------+
    +------------+     |RolesUsers     |
    |Roles       |     |---------------|    +---------------+
    |+-----------|     |ID             |    |Users          |
 +-+|ID          |+---+|RoleID         |    |---------------|
 |  |RoleName    |     |UserID         |+--+|ID             |
 |  +------------+     +---------------+    |UserName       |
 |                                          +---------------+
 |
 |  +-----------------+
 |  |RolesMemberRoles |
 |  |-----------------|
 |  |ID               |
 +-+|RoleID           |
 +-+|MemberRoleID     |
    +-----------------+

目标

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

当前访问查询

  • 返回属于某个角色的用户或通过参数
  • 输入的给定角色的成员角色
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);

远见卓识

  • 找到an interesting post,了解如何使用Instr()将一串文本传递到where子句。不知道我怎么可能必须根据我的情况调整它。

2 个答案:

答案 0 :(得分:1)

要实现目标1,您可以使用上面的Remou建议,使用以下查询在WHERE子句中键入RoleNames列表。但是,删除“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;  

要返回能够履行各种角色(目标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;  

上面的SQL假设每个Role都将自己包含在RoleMemberRoles表中的成员中。您应该使用DISTINCT,因为数据模型不会阻止单个用户拥有多个角色,因此会在每个结果集中多次出现。

答案 1 :(得分:0)

建议:在Access项目中,使用Access SQL查询电子表格数据,例如在Access表和Excel数据之间创建JOIN,可能使用带衬里的表。