PostgreSQL查询:获取B包含指定全部值的A唯一值
问题描述
现有如下两列表格:
| Column A | Column B |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
| 3 | 3 |
需要实现两个PostgreSQL查询需求:
- 给定一组B值(如
[1,2]),获取所有包含该组中全部B值的唯一A值,预期结果为A = [1,2] - 给定一组A值,获取所有与这些A关联的B实例
解决方案一:获取包含指定全部B值的A
方法1:GROUP BY + HAVING(通用高效)
通过分组统计每个A对应的B值覆盖情况,筛选出完全包含目标B值的记录:
SELECT "Column A" FROM your_table_name WHERE "Column B" IN (1, 2) GROUP BY "Column A" HAVING COUNT(DISTINCT "Column B") = 2; -- 2对应目标B值的总数量
COUNT(DISTINCT "Column B")用于避免同一B值重复出现导致的误判,确保A确实覆盖了所有目标B值。
方法2:INTERSECT(适合少量目标值)
对每个目标B值单独查询对应的A,再取交集得到同时满足条件的A:
SELECT "Column A" FROM your_table_name WHERE "Column B" = 1 INTERSECT SELECT "Column A" FROM your_table_name WHERE "Column B" = 2;
逻辑直观,当目标B值数量不多时可读性强。
方法3:数组包含判断(PostgreSQL特有)
利用PostgreSQL数组函数,将每个A对应的B值聚合为数组,再判断目标数组是否被完全包含:
SELECT "Column A" FROM your_table_name GROUP BY "Column A" HAVING ARRAY[1,2] <@ ARRAY_AGG("Column B");
<@是PostgreSQL的数组包含运算符,左边的目标数组必须完全存在于右边的聚合数组中。
解决方案二:获取指定A值关联的所有B
直接过滤目标A值,查询对应的B即可,如需去重则添加DISTINCT:
SELECT DISTINCT "Column B" FROM your_table_name WHERE "Column A" IN (1, 3); -- 替换为实际给定的A值列表
如果需要保留多对多连接表的原始关联记录(允许B值重复),去掉DISTINCT即可。
内容的提问来源于stack exchange,提问作者Samier
相关产品推荐
相关产品推荐

