Um Ziel 1 zu erreichen, können Sie den obigen Vorschlag von Remou verwenden und eine Liste von Rollennamen in das Feld WHERE
Klausel mit der folgenden Abfrage. Es könnte jedoch sinnvoller sein, die "WHERE"-Klausel zu entfernen, die Abfrage auszuführen und sie dann in Excel einzufügen, um eine "schnelle und schmutzige" Filterung durchzuführen (Ziel 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;
Um die Anzahl der Benutzer zu ermitteln, die in der Lage sind, die verschiedenen Rollen zu erfüllen (Ziel 2), können Sie Folgendes ausführen.
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;
Die obige SQL setzt voraus, dass jede Rolle sich selbst als Mitglied in der Tabelle RoleMemberRoles enthält. Sie sollten verwenden DISTINCT
weil das Datenmodell nicht verhindert, dass ein einzelner Benutzer mehrere Rollen innehat und somit mehrfach in jeder Ergebnismenge auftaucht.