必须有一个简单的解决方案,我找不到或弄清楚,但它让我疯了
有一张表A
id
1
2
3
有一张表B
id
a
b
c
表A_B
之间存在多对多的关系a_id b_id
1 a
1 c
1 b
2 a
2 c
3 b
我想要一个具有一组B元组的输入的查询,并找出A的元组中的哪一个作为子集。
例如
Input c
Output {1,2}
Input {a,c}
Output {1,2}
Input {a,b}
Output {1}
Input {b}
Output {1,3}
我提出这样做的唯一方法是为每个单独的标签选择所有行并在这些行上执行交集。这似乎效率低下。
答案 0 :(得分:4)
这个查询应该做你想要的; in
列表中的项目数必须与having
的参数匹配:
select a_id from table_A_B
where b_id in ('a','c')
group by a_id having count(distinct b_id) = 2
只有在允许重复行时才需要distinct
。
在您的测试用例中查看此sample SQL Fiddle。
答案 1 :(得分:0)
您可以在inner join
上A_B
a_id
个b_id
表格,这将提供所提供的select c.a_id
from A_B as c
where c.b_id = 'c';
select a.a_id
from A_B as a
inner join A_B as c
on c.a_id = a.a_id
where a.b_id = 'a'
and c.b_id = 'c';
select a.a_id
from A_B as a
inner join A_B as b
on b.a_id = a.a_id
where a.b_id = 'a'
and b.b_id = 'b';
select b.a_id
from A_B as b
where b.b_id = 'b';
值之间的值的交集:
{{1}}