根据包含选择交叉引用(列值为子集)

时间:2016-04-21 12:56:21

标签: sql

假设我有一个交叉引用表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)的子集。

1 个答案:

答案 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)上),因此这应该有更好的性能。