Для достижения цели 1 вы можете использовать предложенное выше предложение Рему, чтобы ввести список RoleNames в предложение 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
, потому что модель данных не запрещает одному пользователю иметь несколько ролей и, следовательно, появляется несколько раз в каждом наборе результатов.