Этот SELECT должен возвращать количество препятствий, которые никто не преодолел.Если счет равен нулю, то все препятствия были преодолены хотя бы одним человеком.
SELECT count(*)
FROM (SELECT po.person_id, o.obstacle_id
FROM Obstacle o
LEFT OUTER JOIN Person_overcomes_obstacle po
ON (o.obstacle_id = po.obstacle_id)) t
WHERE t.person_id IS NULL
Вы также можете сделать это для того же эффекта (и, возможно, лучшей производительности):
SELECT count(*)
FROM Obstacle o
WHERE NOT EXISTS (SELECT 1
FROM Person_overcomes_obstacle po
WHERE po.obstacle_id = o.obstacle_id)
РЕДАКТИРОВАТЬ: Как указано в комментариях, два вышеупомянутых запроса только доказывают, что нет никаких препятствий, которые никто не преодолел, и что ни один человек не преодолел все препятствия.все еще можно доказать, что один пользователь преодолел все препятствия без запроса таблицы Person:
SELECT t.personid, count(*)
FROM (SELECT DISTINCT po.person_id, o.obstacle_id
FROM Obstacle o
JOIN Person_overcomes_obstacle po
ON (o.obstacle_id = po.obstacle_id)) t
GROUP BY t.persion_id
HAVING count(*) = (SELECT count(*)
FROM obstacle)