假设我有一个交叉引用表t
,其中包含以下数据:
| id | a_id | b_id |
--------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 7 |
| 5 | 2 | 3 |
| 6 | 3 | 2 |
| 7 | 3 | 3 |
选择a_id
作为给定集的子集的所有b_id
的传统方法是什么?
例如,对于某些集合(1,2,3,4,5)
,我希望得到结果:
| a_id |
--------
| 1 |
| 3 |
由于a_id
1和3是唯一的b_id
集合,它是(1,2,3,4,5)的子集。
答案 0 :(得分:2)
select a_id
from t
group by a_id
having sum(case when b_id not in (1, 2, 3, 4, 5) then 1 else 0 end) = 0;
但是,假设您有一个a
表,那么我更喜欢这种方法:
select a_id
from a
where not exists (select 1
from t
where t.a_id = a.a_id and t.b_id not in (1, 2, 3, 4, 5)
);
这节省了聚合费用,查找可以利用适当的索引(在t(a_id, b_id)
上),因此这应该有更好的性能。