PostgreSQL左连接后如何避免重复数据
解决SQL查询中的重复数据问题
问题分析
你的原查询用OR连接关联条件,会导致同一个f_lab记录被多次匹配——比如一条fac_vis行的sending_id和receiving_id会分别关联到f_lab,生成两条重复记录;同时如果多条fac_vis行指向同一个receiving_id,也会重复输出该id的f_lab数据。
解决方案
以下两种方法都能确保每个fac_id对应的f_lab数据只返回一次:
方法1:用UNION合并结果
UNION会自动去除重复行,刚好满足需求:
-- 获取目标sending_id自身的f_lab数据 SELECT fl.* FROM f_lab fl WHERE fl.fac_id = '1' UNION -- 获取所有关联receiving_id对应的f_lab数据 SELECT fl.* FROM fac_vis fv JOIN f_lab fl ON fl.fac_id = fv.receiving_id WHERE fv.sending_id = '1';
方法2:先收集去重后的目标ID列表,再查询
先通过子查询把需要的fac_id(目标sending_id + 所有关联的receiving_id)去重,再关联f_lab:
SELECT fl.* FROM f_lab fl WHERE fl.fac_id IN ( -- 合并目标ID和关联ID并去重 SELECT '1' AS fac_id UNION SELECT fv.receiving_id FROM fac_vis fv WHERE fv.sending_id = '1' );
说明
两种方法核心都是先确保要查询的fac_id列表没有重复,再从f_lab获取对应数据,避免了原查询中因多条件关联导致的重复问题。
内容的提问来源于stack exchange,提问作者Abhimanyu Patil
相关产品推荐
相关产品推荐

