从两张SQL表统计worker对应行数,解决关联查询字段未知报错
两张表按worker分维度统计行数解决方案
问题原因分析
- 直接JOIN统计数值异常:如果同一个worker在表1有N条记录、表2有M条记录,JOIN后会生成N*M条笛卡尔积记录,COUNT计数会翻倍,结果不符合预期。
Unknown column druga_klasa.pracownik in field list报错原因:- GROUP BY语句中只写了
pracownik,两张表都存在该字段,数据库无法判断字段归属 - 如果你使用的是MySQL数据库,本身不支持FULL JOIN语法,也会触发语法/字段识别错误
- FULL JOIN场景下,仅存在于单表的worker对应的另一表字段为NULL,直接SELECT某张表的pracownik会出现取值缺失问题
- GROUP BY语句中只写了
正确实现方案
优先采用「先单表统计、再合并关联」的写法,兼容所有主流SQL方言,同时避免笛卡尔积问题:
通用示例(对应你最开始的两张测试表)
SELECT t.worker, COALESCE(t1.cnt, 0) AS count_numbers_tab1, COALESCE(t2.cnt, 0) AS count_numbers_tab2 FROM ( -- 合并两张表的所有worker去重 SELECT worker FROM table1 UNION SELECT worker FROM table2 ) t -- 关联表1的统计结果 LEFT JOIN ( SELECT worker, COUNT(*) AS cnt FROM table1 GROUP BY worker ) t1 ON t.worker = t1.worker -- 关联表2的统计结果 LEFT JOIN ( SELECT worker, COUNT(*) AS cnt FROM table2 GROUP BY worker ) t2 ON t.worker = t2.worker;
适配你的业务场景的修改后语句
SELECT t.pracownik, COALESCE(dk.cnt, 0) AS count_druga_klasa, COALESCE(zz.cnt, 0) AS count_zlewy_zlomy FROM ( SELECT pracownik FROM druga_klasa UNION SELECT pracownik FROM zlewy_zlomy ) t LEFT JOIN ( SELECT pracownik, COUNT(numer_zlecenia) AS cnt FROM druga_klasa GROUP BY pracownik ) dk ON t.pracownik = dk.pracownik LEFT JOIN ( SELECT pracownik, COUNT(numer_zlecenia) AS cnt FROM zlewy_zlomy GROUP BY pracownik ) zz ON t.pracownik = zz.pracownik;
写法说明
- UNION会自动对两张表的worker字段去重,确保所有出现过的worker都会被统计到
- 先单独统计每张表的维度计数,完全避免JOIN带来的笛卡尔积计数错误,不管你用的是哪种SQL方言都通用
- COALESCE函数会把不存在的统计值替换为0,不会出现NULL结果
- 所有字段都明确指定所属别名,不会出现字段归属模糊的报错
内容的提问来源于stack exchange,提问作者zcoderx
相关产品推荐
相关产品推荐

