我有一个包含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,因为它是超集。
非常感谢
答案 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的行数。这对于确保拥有所有这些非常重要。
然后,该查询会在category
和sector
上进行自我加入。它按第一个id聚合并计算匹配的行。如果全部匹配,则保留id
。