【问题标题】:How to pass multiple values to parameter in Access?如何将多个值传递给Access中的参数?
【发布时间】:2011-11-30 15:47:27
【问题描述】:

背景/总体目标

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

数据库结构

                       +---------------+
    +------------+     |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 子句。不过,我不确定如何根据自己的情况进行调整。

【问题讨论】:

  • 哈,+1 花时间画出表格结构...非常好。
  • 谢谢,Jeremy -- 表格由 asciiflow.com 提供 -- 我发现它对此类情况非常有帮助。
  • 你知道你可以说WHERE Field IN ("abc","def"),不是吗?
  • 您的标签列表不包括 Excel。
  • 如果您将 Excel 工作表链接到 Access 数据库,您肯定可以这样做吗?

标签: sql excel ms-access parameters


【解决方案1】:

要实现目标 1,您可以使用 Remou 的上述建议,通过以下查询在 WHERE 子句中键入角色名称列表。但是,删除“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 假设每个角色都包含自己作为表 RoleMemberRoles 中的成员。您应该使用DISTINCT,因为数据模型不会阻止单个用户拥有多个角色并因此在每个结果集中出现多次。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      相关资源
      最近更新 更多