如何将多条统计计数的SQL Update语句合并为单条更新#tbl_rprt的语句
完全可以合并为单条UPDATE语句实现相同效果,且执行效率远高于原有多条UPDATE写法
合并后SQL实现
UPDATE #tbl_rprt SET a_count = a.a_count, b_count = a.b_count, c_count = a.c_count, d_count = a.d_count, e_count = a.e_count FROM ( SELECT new_c1, new_c2, COUNT(CASE WHEN a_flg = 'Y' THEN 1 END) AS a_count, COUNT(CASE WHEN b_flg = 'Y' THEN 1 END) AS b_count, COUNT(CASE WHEN c_flg = 'Y' THEN 1 END) AS c_count, COUNT(CASE WHEN d_flg = 'Y' THEN 1 END) AS d_count, COUNT(CASE WHEN e_flg = 'Y' THEN 1 END) AS e_count FROM wrk_tbl_flgs GROUP BY new_c1, new_c2 ) a WHERE a.new_c1 = #tbl_rprt.class AND a.new_c2 = #tbl_rprt.rm
逻辑说明
- 核心采用条件聚合逻辑:通过
CASE WHEN判断对应标识是否为'Y',符合条件则返回非NULL值,COUNT函数仅统计非NULL值,仅需扫描一次wrk_tbl_flgs表即可计算出所有标识的分类计数,避免原有写法多次重复扫描表的性能损耗,数据量越大性能提升越明显。 - 关联更新逻辑和原有多条UPDATE完全一致,统计结果和旧逻辑匹配。
- 若需完全对齐原有逻辑(即无对应'Y'记录的分组保留
#tbl_rprt字段原有值,而非覆盖为0),可将SET部分的赋值调整为如下形式:a_count = COALESCE(a.a_count, #tbl_rprt.a_count), b_count = COALESCE(a.b_count, #tbl_rprt.b_count), -- 其余字段按相同规则调整即可 - 如果你使用的数据库支持
FILTER语法(如PostgreSQL),还可以将计数逻辑简化为COUNT(*) FILTER (WHERE a_flg = 'Y') AS a_count,可读性更高。
内容的提问来源于stack exchange,提问作者Amommy
相关产品推荐
相关产品推荐

