sql - 按对组查询
问题描述
给定下表:
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
解决方案
你似乎想要这些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);
推荐阅读
- excel - 使用 VBA 根据单元格值将动态范围复制到另一个工作簿
- xml - 使用键的某些元素的 XSL 计数
- javascript - 正则表达式:搜索字符串中的所有 css 类(带(/out)间距)
- sharepoint - 如何在 SharePoint 中的表格上保存输入?
- html - 如何从父组件 CSS 将宽度应用于特定子 ngx-bootstrap 模态
- input - 寻找一种好的输出格式来使用从 Nextflow 的新脚本/进程中的文件中提取的值
- unity3d - Unity3D 停止计数器
- ios - 在 SwiftUI 中手动设置明暗模式并节省用户选择
- javascript - 如何在高图表地图的选定区域上添加图标?
- java - 来自 org.springframework.data.mybatis.annotations.Version 的 @Version 在更新时不会增加 1,因为条件会破坏查询