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

时间:2016-04-21 16:23:07

标签: sql

给出与ta相关的交叉引用表b

| 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的传统方法是什么?

例如,对于集合(2,3),我希望得到结果:

| a_id |
--------
| 1    |
| 3    |

由于a_id 1和3是b_id唯一的(2,3)超集集。

到目前为止我找到的最佳解决方案(感谢this answer):

select id
from a
where 2 = (select count(*)
           from t
           where t.a_id = a.id and t.b_id in (2,3)
          );

但我更倾向于在运行查询之前避免计算基数这样的内容。

1 个答案:

答案 0 :(得分:1)

您可以简单地将查询调整为:

select id
from a cross join
     (select count(*) as cnt
      from t
      where . . .
     ) x
where x.cnt = (select count(*)
               from t
               where t.a_id = a.id and t.b_id in (2,3)
              );