2011-11-30 71 views
4

背景/总目标

  • 我有一个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子句。不知道我可以怎样调整,以我的情况。
+0

哈,+1抽出时间来绘制表格结构...非常好。 –

+5

谢谢,杰里米 - 桌子是http://www.asciiflow.com/礼貌 - 我发现它对这类情况非常有帮助。 – SeanKilleen

+0

你知道你可以说'Where Field in(“abc”,“def”)'你不是吗? – Fionnuala

回答

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,因为数据模型不会阻止单个用户拥有多个角色,并因此在每个结果集中出现多次。

0

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

相关问题