Oracle如何比较查询中的子集

时间:2017-07-04 12:39:05

标签: sql oracle subset

我有一个包含3列的表(T1):id,category,sector

id, category, sector 
1    1         2 
10   1         3 
10   5         4
20   1         3
20   5         4
20   7         8

我想要一个返回带有startig id的扇区和类别子集的id的查询,即:

select * from T1 where id=10

返回2条记录

我正在尝试编写的查询应返回具有相同2条记录的其他ID 即使他们有其他记录。在此示例中,此查询应仅返回id 20,因为它是超集。

非常感谢

2 个答案:

答案 0 :(得分:0)

似乎你打算使用id 10

选择类别和sectore的所有行
select t1.id from t1 
inner join (
  select  category, sector 
  from T1 where id=10 
) t on t.category = t1.category and t.sector = t1.sector

答案 1 :(得分:0)

这是一种方法:

select t.id
from t join
     (select t2.*, count(*) over (partition by id) as cnt
      from t t2
     ) t2
     on t2.category = t.category and t2.sector = t.sector and
        t2.id = 10
group by t.id
having count(*) = t2.cnt;

首先计算每个id的行数。这对于确保拥有所有这些非常重要。

然后,该查询会在categorysector上进行自我加入。它按第一个id聚合并计算匹配的行。如果全部匹配,则保留id