查询table1前三列并统计table2数据的SQL语句异常求助
解决SQL统计匹配行数的问题
先来看下你原SQL里的几个明显问题:
- 重复写了
FROM table1,直接导致语法错误; - 表名拼写错误:
tabel2应该是table2; - 缺少
GROUP BY子句,数据库无法确定按哪些字段分组聚合统计; - JOIN条件只匹配了
orig1,但你的需求应该是同时匹配orig1/orig2/orig3三个字段; - COUNT用法有误:用
COUNT(table2.*)会把LEFT JOIN中无匹配的NULL行也统计为1,得不到正确的匹配行数。
针对你的需求(查询table1前三列的唯一组合,并统计table2中对应匹配的行数),正确的SQL应该是这样的:
SELECT t1.orig1, t1.orig2, t1.orig3, COUNT(t2.orig1) AS count_table2 FROM ( -- 先获取table1中唯一的orig组合,避免重复统计 SELECT DISTINCT orig1, orig2, orig3 FROM table1 ) t1 LEFT JOIN table2 t2 ON t1.orig1 = t2.orig1 AND t1.orig2 = t2.orig2 AND t1.orig3 = t2.orig3 GROUP BY t1.orig1, t1.orig2, t1.orig3;
代码解释:
- 子查询去重:因为table1里有两行
(1,1,1),用SELECT DISTINCT可以确保每个orig组合只出现一次; - LEFT JOIN匹配:同时匹配三个orig字段,保证只有当table2的这三个字段和table1完全一致时才算匹配;
- COUNT统计:用
COUNT(t2.orig1)而不是COUNT(*),因为无匹配时t2的字段会是NULL,COUNT会自动忽略NULL值,得到真实的匹配行数; - GROUP BY分组:按三个orig字段分组,确保每个组合对应一行统计结果。
如果只想显示有匹配的行(和你的预期输出完全一致),可以加上HAVING条件过滤掉count为0的记录:
SELECT t1.orig1, t1.orig2, t1.orig3, COUNT(t2.orig1) AS count_table2 FROM ( SELECT DISTINCT orig1, orig2, orig3 FROM table1 ) t1 LEFT JOIN table2 t2 ON t1.orig1 = t2.orig1 AND t1.orig2 = t2.orig2 AND t1.orig3 = t2.orig3 GROUP BY t1.orig1, t1.orig2, t1.orig3 HAVING COUNT(t2.orig1) > 0;
执行这个SQL后,就能得到你想要的结果:
orig1,orig2,orig3,count_table2 1,1,1,1
内容的提问来源于stack exchange,提问作者Teju Priya
相关产品推荐
相关产品推荐

