Написание запроса для возврата строк только в том случае, если они содержат все элементы из другой таблицы

#postgresql

Вопрос:

У меня есть относительно сложная проблема, которую я пытаюсь решить с помощью запроса, и мне интересно, можно ли это сделать с помощью одного запроса.

Для простого примера у меня есть таблицы для:

  • authors (идентификатор, имя, фамилия, дата вступления в силу, дата выхода на пенсию)
  • articles (идентификатор, идентификатор автора, название, содержимое)
  • recipients (идентификатор, имя, адрес электронной почты)
  • subscriptions (идентификатор автора, адрес электронной почты)

Подписки, например, выглядят так:

 // Subscriptions table

author_id   email
1           'johnsmith@gmail.com'
1           'jackymoon@gmail.com'
2           'edmonix@gmail.com'
1           'louredwood@gmail.com'
2           'louredwood@gmail.com'
3           'louredwood@gmail.com'
4           'louredwood@gmail.com'
 

и т.д…

Я хочу вернуть список электронных писем, в котором электронное письмо возвращается только в том случае, если количество раз, когда оно встречается в таблице, равно второму запросу.

 query_1 = SELECT email FROM recipients
          WHERE email has an entry for every author returned from query_2...

query_2 = SELECT * FROM authors
          WHERE current_date BETWEEN effective_date AND retirement_date
 

До сих пор мне приходилось выполнять только простые запросы, так что любая помощь будет очень признательна.

Ответ №1:

Простым решением было бы использовать подзапросы в предложении WHERE.

выбирать…. ГДЕ (ВЫБЕРИТЕ КОЛИЧЕСТВО(*) ИЗ подписок s, ГДЕ s.email = rp.email) = (ВЫБЕРИТЕ КОЛИЧЕСТВО(*) ИЗ авторов)

(найдите записи rp, где количество подписок равно количеству авторов) Или аналогичную комбинацию — например, найдите все записи rp, где количество не подписанных авторов равно 0