PostgreSQL:单表内指定Column A对应的Column B交集视图需求
解决方案
核心思路
要实现需求需分三步完成:
- 动态获取查询时指定的
Column A集合及其总数量; - 筛选出所有
Column B值——这些值必须存在于指定集合的每一个Column A对应的记录中,通过统计每个B值关联的不同A的数量等于集合总数量来判断; - 将每个指定的
Column A与筛选出的交集B值配对,同时验证该组合确实存在于原表中(利用主键约束可简化逻辑,但保留检查更严谨)。
创建视图的SQL语句
假设原表名为your_table,执行以下标准SQL语句创建视图:
CREATE VIEW myView AS WITH selected_a AS ( -- 动态获取当前查询指定的所有Column A值 SELECT DISTINCT "Column A" FROM your_table ), intersection_b AS ( -- 筛选出在所有指定A中都存在的Column B值 SELECT "Column B" FROM your_table WHERE "Column A" IN (SELECT "Column A" FROM selected_a) GROUP BY "Column B" HAVING COUNT(DISTINCT "Column A") = (SELECT COUNT(*) FROM selected_a) ) -- 生成每个指定A与交集B的配对组合 SELECT sa."Column A", ib."Column B" FROM selected_a sa CROSS JOIN intersection_b ib WHERE EXISTS ( SELECT 1 FROM your_table t WHERE t."Column A" = sa."Column A" AND t."Column B" = ib."Column B" );
使用示例
执行目标查询语句:
SELECT "Column A", "Column B" FROM myView WHERE "Column A" IN ('abc','def','ghi');
将返回预期结果:
| Column A | Column B |
|---|---|
| 'abc' | 3 |
| 'def' | 3 |
| 'ghi' | 3 |
说明
- 方案基于标准SQL实现,无需任何扩展插件;
- 视图可适配
WHERE "Column A" IN (...)中的任意大小的集合,动态计算交集并返回配对结果; EXISTS子句确保返回的组合完全符合原表的主键约束逻辑。
内容的提问来源于stack exchange,提问作者Andreas Beyer
相关产品推荐
相关产品推荐

