2011-11-30 65 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

相關問題