SQL查询:获取覆盖pm(1,2,3)全部取值的对应pt字段值
SQL实现:查找关联了全部指定第二列取值的第一列值
这个需求属于典型的关系除法场景,目标是找出所有满足「关联的pm字段覆盖1、2、3全部三个取值」的pt值,针对给出的样例数据,以下写法都可以正确返回结果1:
通用写法(适配绝大多数数据库)
直接按pt分组,筛选出pm在目标集合内、且去重后pm数量等于目标值总个数的分组即可,可读性最好:
SELECT pt FROM 你的表名 WHERE pm IN (1, 2, 3) GROUP BY pt HAVING COUNT(DISTINCT pm) = 3;
如果表中已经做了(pt, pm)的联合唯一约束,不存在同一个pt对应重复pm值的情况,可以去掉DISTINCT,查询性能会更高:
SELECT pt FROM 你的表名 WHERE pm IN (1, 2, 3) GROUP BY pt HAVING COUNT(pm) = 3;
扩展写法(适配目标值存在维度表的场景)
如果需要匹配的pm值存储在独立的维度表中,后续可能调整目标取值范围,可以改成关联+动态计数的写法,不需要手动修改HAVING后的匹配数量:
SELECT t.pt FROM 你的表名 t JOIN pm维度表 p ON t.pm = p.pm WHERE p.pm IN (1, 2, 3) GROUP BY t.pt HAVING COUNT(DISTINCT t.pm) = ( SELECT COUNT(*) FROM pm维度表 WHERE pm IN (1,2,3) );
结果验证
代入提供的测试数据:
| pt | pm |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
- pt=1分组下匹配到的pm去重后共3个,满足条件
- pt=2分组下匹配到的pm去重后共2个,不满足条件
最终返回结果和预期一致,为1。
内容的提问来源于stack exchange,提问作者Denish Desai
相关产品推荐
相关产品推荐

