使用COUNT CASE WHEN EXISTS实现SQL两表关联匹配计数列
需求实现方案
该需求完全可以通过SQL实现,也支持基于COUNT CASE WHEN EXISTS语法完成,同时提供性能更优的左连接聚合方案。
方案1:左连接+条件聚合(推荐)
这是生产环境最常用、执行性能最优的写法,直接通过关联匹配后统计行数:
SELECT t1.CA, t1.D, COUNT(t2.D) AS `COUNT`, CONCAT('表2中CA为', t1.CA, '且D>=', t1.D, '的记录共', COUNT(t2.D), '条') AS EXPLANATION FROM table1 t1 LEFT JOIN table2 t2 ON t1.CA = t2.CA AND t1.D <= t2.D GROUP BY t1.CA, t1.D;
逻辑说明
- 用LEFT JOIN保证table1的所有行都保留,关联条件同时匹配CA相等、table2的D大于等于table1的D
- COUNT统计非空的table2字段值,就是符合条件的匹配记录数
- 最后用CONCAT拼接得到解释字段,完全匹配期望输出
方案2:COUNT+EXISTS相关语法实现
如果你需要指定用EXISTS类语法实现,也可以按如下方式编写:
SELECT t1.CA, t1.D, (SELECT COUNT(*) FROM table2 t2 WHERE t2.CA = t1.CA AND t2.D >= t1.D) AS `COUNT`, CONCAT('表2中CA为', t1.CA, '且D>=', t1.D, '的记录共', (SELECT COUNT(*) FROM table2 t2 WHERE t2.CA = t1.CA AND t2.D >= t1.D), '条') AS EXPLANATION FROM table1 t1;
逻辑说明
- 通过关联子查询逐行统计table1每行匹配到的table2的记录数
- 写法更简洁不需要GROUP BY,但如果table1数据量很大,性能会低于左连接方案,适合小表统计场景
内容的提问来源于stack exchange,提问作者banana_99
相关产品推荐
相关产品推荐

