Выберите записи, в которых каждая запись в соединении «один ко многим» соответствует условию - PullRequest
0 голосов
/ 23 ноября 2018

Как мне написать SQL-запрос, который возвращает записи из таблицы A , только если каждая связанная запись из таблицы B соответствует условию?

Я работаю в Ruby, и я могу закодировать эту логику для простой коллекции, например, так:

array_of_A.select { |a| a.associated_bs.all? { |b| b.matches_condition? } }

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

Я знаю, что случай INNER JOIN является эквивалентом

array_of_A.select { |a| a.associated_bs.any? { |b| b.matches_condition? } }

Я пробовал оба:

SELECT DISTINCT "A".* FROM "A"
INNER JOIN "B"
  ON "B"."a_id" = "A"."id"
WHERE "B"."string' = 'STRING'

, а также:

SELECT DISTINCT "A".* FROM "A"
INNER JOIN "B"
  ON "B"."a_id" = "A"."id"
  AND "B"."string' = 'STRING'

В обоих случаях (как я и ожидал) он возвращает записи из таблицы A, если любая связанная запись из B соответствует условию.Я уверен, что есть относительно простое решение, но мое понимание SQL просто не дает мне его в данный момент.И все мои поиски через SO и Google оказались бесплодными.

1 Ответ

0 голосов
/ 23 ноября 2018

Я бы предложил следующее:

select distinct a.* 
from a inner join 
(
    select b.a_id 
    from b 
    group by b.a_id 
    having min(b.string) = max(b.string) and min(b.string) = 'string'
) c on a.id = c.a_id

В качестве альтернативы:

select distinct a.* 
from a inner join b on a.id = b.a_id
where not exists (select 1 from b c where c.a_id = a.id and c.string <> 'string')

Примечание: В приведенных выше примерах меняйте только символы a иb к именам ваших таблиц;другие идентификаторы являются просто псевдонимами и не должны быть изменены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...