Если бы у меня была таблица PERMISSIONS
, которая выглядела бы так:
PERSON PERMISSION
------ ----------
Bob red
John red
John blue
Mary red
Mary blue
Mary yellow
и таблица THINGS, которая выглядела бы так:
THING PERMISSION
----- ----------
apple red
eggplant red
eggplant blue
Я пытаюсь подойтис помощью чистого SQL-запроса, который позволил бы мне выяснить, какие PERSON
s имеют доступ к каким THING
s.По сути, я хочу запрос, который будет выглядеть примерно так:
SELECT person
FROM ... vague handwaving here ...
WHERE thing = 'eggplant'
, и он будет возвращать "Джон" и "Мэри".Ключевым моментом является количество разрешений, необходимых для доступа к объекту, является произвольным.
Мне кажется, это должно быть очевидно, но я просто не могу придумать элегантное решение.Предпочтительны совместимые решения Oracle.
Редактировать:
Решения от Косты и Дж.Брукса работают хорошо.Ниже приведена модифицированная версия решения Kosta, которое только дважды попадает в индексы, в отличие от 3x для Kosta и 4x для JBrooks (хотя я согласен с JBrooks в том, что это, вероятно, ненужная оптимизация).
SELECT p.person, num_permission, COUNT(p.person)
FROM permissions p
INNER JOIN (
SELECT permission,
COUNT(1) OVER (PARTITION BY thing) AS num_permission
FROM things
WHERE thing = 'eggplant'
) t ON t.permission = p.permission
GROUP BY p.person, num_permission
HAVING COUNT(p.person) = num_permission