PostgreSQL查询:获取同时含a、b的uid对应的b的source_id
问题与解决方案
原始数据表
uid source source_id 1 a 101 1 b 201 1 c 301 2 a 102 2 c 302 3 a 103 3 b 203
需求
创建视图,返回符合以下要求的记录:
- 行的
source字段值为'b' - 对应的
uid在表中同时存在source为'a'和'b'的记录
期望输出
uid source_id 1 201 3 203
可行的SQL写法
方法一:使用WHERE EXISTS(简洁版)
利用EXISTS子查询校验当前uid是否存在source='a'的记录,同时当前行已经是source='b',刚好满足双条件:
CREATE VIEW target_view AS SELECT uid, source_id FROM your_table t_main WHERE source = 'b' AND EXISTS ( SELECT 1 FROM your_table t_check WHERE t_check.uid = t_main.uid AND t_check.source = 'a' );
方法二:使用关联查询
通过自连接筛选出同时拥有a和b记录的uid,再取出对应b的source_id:
CREATE VIEW target_view AS SELECT t_b.uid, t_b.source_id FROM your_table t_b JOIN your_table t_a ON t_b.uid = t_a.uid WHERE t_b.source = 'b' AND t_a.source = 'a' GROUP BY t_b.uid, t_b.source_id; -- 若同一uid有多条source='b'的记录,GROUP BY避免重复输出
方法三:分组+条件筛选
先按uid分组,通过HAVING子句校验该分组同时存在a和b的记录,再提取b对应的source_id:
CREATE VIEW target_view AS SELECT uid, MAX(CASE WHEN source = 'b' THEN source_id END) AS source_id FROM your_table GROUP BY uid HAVING SUM(CASE WHEN source = 'a' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN source = 'b' THEN 1 ELSE 0 END) > 0;
注:如果同一uid对应多条source='b'的记录,可根据需求替换MAX为MIN或其他聚合函数。
内容的提问来源于stack exchange,提问作者user20730860
相关产品推荐
相关产品推荐

