PostgreSQL多表连接返回重复数据排查及优化咨询
解决SQL连接重复数据&效率问题的思路
嘿,刚接触SQL遇到这种重复数据的问题太正常了,我来帮你拆解清楚~
首先说为什么会出现重复数据:你现在把同一个file表当成三个别名(a、b、c)来做内连接,这就相当于把同一张表和自己连了两次。如果file表中同一个id对应多条记录,那a INNER JOIN b会先把a中每条id匹配的记录和b中同id的记录两两组合,再和c中同id的记录再次两两组合,这就产生了笛卡尔积,自然会出现大量重复行。
再说说效率问题:这种重复连接同一张表的操作会让数据库处理远超实际需要的数据量,计算量陡增,效率肯定高不了。
针对性的解决方案
分两种情况来处理:
情况1:你其实是在同一张表内计算字段差值
看你的查询字段,都是file表中的字段(number、number2、number3、number4、score),那完全不需要做任何连接!直接单表查询就能搞定:
SELECT id, number, number2, number3, number4, score, (number - number3) AS a_b_difference, (number2 - number4) AS a_b_difference3 FROM file;
这样既不会有重复数据,查询效率也是最高的。
情况2:确实是三个不同的表(可能你笔误写成了同一个file)
如果是file_a、file_b、file_c三张不同的表,那要确保每张表中id是唯一主键(每个id只对应一条记录),这样内连接后就不会有重复。如果某张表中id有重复,那需要先去重再连接,比如用DISTINCT或者聚合函数取唯一值:
SELECT a.id, a.number, a.number2, b.number3, b.number4, c.score, (a.number - b.number3) AS a_b_difference, (a.number2 - b.number4) AS a_b_difference3 FROM (SELECT DISTINCT id, number, number2 FROM file_a) a INNER JOIN (SELECT DISTINCT id, number3, number4 FROM file_b) b ON a.id = b.id INNER JOIN (SELECT DISTINCT id, score FROM file_c) c ON a.id = c.id;
如果重复的id对应字段值不同,你可能需要用MAX()、MIN()或者AVG()来聚合,比如SELECT id, MAX(number) AS number FROM file_a GROUP BY id,根据你的业务需求选择合适的聚合方式。
小提示
以后写连接查询前,先确认:
- 连接的表是不是真的需要?能不能单表完成?
- 连接的关联字段(这里是id)在每个表中是不是唯一的?如果不唯一,一定要先处理重复数据再连接。
内容的提问来源于stack exchange,提问作者user6754289
相关产品推荐
相关产品推荐

