You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询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;

代码解释:

  1. 子查询去重:因为table1里有两行(1,1,1),用SELECT DISTINCT可以确保每个orig组合只出现一次;
  2. LEFT JOIN匹配:同时匹配三个orig字段,保证只有当table2的这三个字段和table1完全一致时才算匹配;
  3. COUNT统计:用COUNT(t2.orig1)而不是COUNT(*),因为无匹配时t2的字段会是NULL,COUNT会自动忽略NULL值,得到真实的匹配行数;
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:09:24