跨表SQL查询问题:基于user_id关联tableA与tableB筛选数据
问题分析与修正方案
你的SQL核心问题是表的逻辑完全搞反了,同时存在字段归属错误和多余的聚合逻辑,具体问题点:
- 原需求是从
tableA筛选flag_count=12的user_id,再查询tableB的匹配行,但你主查询查的是tableA,子查询却查tableB,完全颠倒了查询对象 flag_count是tableA的字段,你在tableB的子查询中使用该字段,若tableB无此字段会直接报错- 额外添加的
group by user_id having count(*) = 1属于冗余逻辑,原需求未要求user_id仅出现一次
修正后的写法
写法1:IN子查询(逻辑直观,贴合需求步骤)
SELECT * FROM public.tableB WHERE user_id IN ( -- 先从tableA筛选出flag_count=12的所有user_id SELECT user_id FROM public.tableA WHERE flag_count = 12 ) AND registered = 'true';
写法2:JOIN关联查询(大数据量下性能更优)
如果tableA中同一个user_id可能有多条flag_count=12的记录,用DISTINCT去重避免结果重复:
SELECT DISTINCT b.* FROM public.tableA a JOIN public.tableB b ON a.user_id = b.user_id WHERE a.flag_count = 12 AND b.registered = 'true';
若tableA中每个user_id对应flag_count=12的记录唯一,可去掉DISTINCT。
内容的提问来源于stack exchange,提问作者dazfaz
相关产品推荐
相关产品推荐

