Как написать запрос Sql, чтобы найти все участвующие строки в другой таблице?

Есть 3 таблицы: события, события клиентов и клиентов.

Написать запрос, который находит события, к которым имеют доступ все клиенты?

Внутреннее объединение не гарантирует участия всех строк в таблице, поэтому это не поможет:

select * from events e
inner join eventclients ec on e.id = ec.eventid
inner join clients c on etc.clientid = c.id

3 ответа

Вы можете использовать вложенный NOT EXISTS чтобы проверить это:

SELECT e.* 
FROM   events e 
WHERE NOT EXISTS(
    SELECT 1 FROM  client c 
    WHERE NOT EXISTS(
        SELECT 1 FROM eventclients ec 
        WHERE ec.eventid = e.id AND c.id= ec.clientid 
    )
)

демонстрация

Вы также можете сделать

SELECT e.id, e.name
  FROM events e LEFT JOIN eventclients ec
    ON e.id = ec.eventid LEFT JOIN clients c
    ON ec.clientid = c.id
 GROUP BY e.id, e.name
HAVING COUNT(ec.clientid) = 
(
  SELECT COUNT(*) FROM clients
)

Вот демоверсия SQLFiddle

Предполагая, что вы имеете в виду, что событие имеет отношение многие-ко-многим с клиентом, а event_client - это мостовая таблица между ними, вам следует ответить на любой из множества других вопросов, касающихся SQL-соединения между отношениями "многие ко многим".

SQL многие ко многим выбирают

Как отфильтровать результаты SQL в сквозном отношении

Другие вопросы по тегам