You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:15:28