选择一对多连接中的每个记录都符合条件的记录

时间:2018-11-23 17:22:24

标签: sql ruby

仅在表A中的所有关联记录 与条件匹配的 每个条件下,如何编写返回表B中的记录的SQL查询?

我正在使用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 :(得分:2)

我建议以下内容:

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')

注意:在以上示例中,仅将符号ab更改为表的名称;其他标识符仅仅是别名,不应更改。