У меня есть следующие таблицы в моей базе данных SQL Server;Как я могу выбрать всех пользователей, у которых есть набор разрешений, а не одно конкретное разрешение SQL?
учетная_запись_пользователя
Username | UserId
Joe | 1
Hannah | 2
Jack | 3
Jill | 4
Разрешение
Permission | PermissionId
p1 | 1
p2 | 2
p3 | 3
p4 | 4
UserPermission
UserId | PermissionId
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
2 | 2
2 | 4
3 | 1
3 | 2
3 | 3
4 | 2
4 | 3
4 | 4
Я хочу вернуть набор имен пользователей, где пользователь имеет разрешения p1 и p2, но не разрешение p3.
Username
Hannah
Ближайший я получил это;
SELECT ua.Username
FROM UserPermission up
JOIN UserAccount ua ON ua.UserID = up.UserId
JOIN Permission p ON p.PermissionId = up.PermissionId
WHERE p.Name = 'p1' OR p.Name = 'p2'
GROUP BY up.UserId,ua.Username
HAVING COUNT(up.UserId) = 2
Что возвращает только пользователи, имеющие разрешения p1 и p2 (и он чувствует, как я буду в совершенно неправильном направлении так или иначе)
Что бы лучший способ, чтобы получить набор результатов, показанный (и что, если бы я хотел пользователей, у которых были p1 и p2, но не p3 или p4 для +1!)?
Спасибо.
Вы идете в правильном направлении. Единственное, что я сделал бы, это 'p.Name IN ('p1', 'p2')' – MatBailie
Это не исключает пользователей, у которых также есть p3 –
. Я не знаю, что именно вы храните как «имя» для разрешения, но лучше было бы ссылаться на них по своим Идентификаторам в предложении WHERE, если это возможно. – marsze