Reputation: 8977
+---------------+
+------------+ |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);
Upvotes: 5
Views: 1910
Reputation: 57023
Suggestion: In your Access project, query the spreadsheet data using Access SQL e.g. create JOIN
s between Access tables and Excel data, possibly using lined tables.
Upvotes: 0
Reputation: 909
To achieve Goal 1, you can use Remou's suggestion above to type a list of RoleNames into the WHERE
clause with the following query. However, it might make more sense just to remove the 'WHERE' clause, run the query, and then paste into Excel for (Goal 3) "quick and dirty" filtering.
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;
To return the count of users capable of fulfilling the various roles (Goal 2) you can run the following.
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;
The above SQL assumes that each Role contains itself as a Member in the table RoleMemberRoles. You should use DISTINCT
because the data model doesn't prevent a single user from having multiple roles and thus appearing multiple times in each result set.
Upvotes: 1