首页 > 解决方案 > 按对组查询

问题描述

给定下表:

TABLE TEST

ID | NAME1 | NAME2
1  | 1     | 2
1  | 1     | 3
1  | 2     | 1
1  | 2     | 3
2  | 1     | 2
2  | 1     | 3
3  | 1     | 2
...

我想通过值对列表查询记录的 ID (NAME1, NAME2)。这是一种按子项搜索父记录的方式,但该表未在层次结构中定义。

即查询[(1, 2), (1, 3)]应该产生以下结果:

QUERY RESULT

ID | NAME1 | NAME2
2  | 1     | 2
2  | 1     | 3

到目前为止,我取得的成就是:

select *
from TEST as T
where exists (
    select *
    from (VALUES(1, 2), (1, 3)) as V(NAME1, NAME2)
    where T.NAME1 = V.NAME1 AND T.NAME2= V.NAME2
)

返回:

1  | 1     | 2
1  | 1     | 3
2  | 1     | 2
2  | 1     | 3
3  | 1     | 2

但我需要的是精确匹配ID

标签: sqlsql-servertsql

解决方案


你似乎想要这些ID。您可以使用聚合:

with pairs as (
      select *
      from (values (1, 2), (1, 3)) v(name1, name2)
     )
select id
from test t left join
     pairs p
     on t.name1 = p.name1 and t.name2 = p.name2
group by id
having count(*) = count(p.name1) and
       count(*) = (select count(*) from pairs);

推荐阅读