PostgreSQL连接表后无法正确统计满足条件的ID数量
问题分析与解决方法
原查询的问题
- 连接逻辑变形:
LEFT JOIN后添加WHERE t2.involvement = 0,会过滤掉Tbl2中无匹配的行,相当于把左连接变成了内连接;同时Tbl2中id=123有2条involvement=0的记录,关联后会生成2行数据,导致计数结果为2而非预期的1。 - 统计目标偏差:原查询试图统计每个ID的符合条件的记录数,但需求是统计满足条件的ID数量(即有多少个ID同时符合
call=15和存在involvement=0的关联记录),而非单ID的记录条数。
正确查询语句
方法1:内连接+去重统计
通过内连接筛选同时满足两边条件的记录,再通过DISTINCT去重后统计ID数量:
SELECT COUNT(DISTINCT t1.id) AS valid_id_count FROM Tbl1 t1 JOIN Tbl2 t2 ON t1.id = t2.id WHERE t1.call = 15 AND t2.involvement = 0;
方法2:EXISTS子查询(更高效)
利用EXISTS判断ID是否存在符合条件的关联记录,直接统计Tbl1中符合call=15且存在对应关联的ID数量:
SELECT COUNT(t1.id) AS valid_id_count FROM Tbl1 t1 WHERE t1.call = 15 AND EXISTS ( SELECT 1 FROM Tbl2 t2 WHERE t2.id = t1.id AND t2.involvement = 0 );
两种方法都能返回预期结果1,其中EXISTS子查询在数据量较大时性能更优,因为它只需判断存在性,无需返回所有匹配记录。
内容的提问来源于stack exchange,提问作者SANAL RAJ
相关产品推荐
相关产品推荐

