平时工作中经常用到union,可以自带去重的操作,今天有个汇总的SQL也用了这个,需求是统计多张表的余额字段,看着就很简单union再sum或者sum再union。
第一种每张表先汇总,使用 UNION ALL 合并后最外层再汇总
SELECT SUM(total_sum) AS grand_total
FROM (
SELECT SUM(column_name) AS total_sum
FROM table1
UNION
SELECT SUM(column_name) AS total_sum
FROM table2
UNION
SELECT SUM(column_name) AS total_sum
FROM table3
) subquery;
第二种每张表不汇总,最外层统一汇总
SELECT SUM(total_sum) AS grand_total
FROM (
SELECT column_name AS total_sum
FROM table1
UNION
SELECT column_name AS total_sum
FROM table2
UNION
SELECT column_name AS total_sum
FROM table3
) subquery;
但是两种结果并不一样,换个表两种方法的结果又一样了,且数据量大的情况下不一样,少的时候一样,当时还看了好久,怀疑是不是空值导致的,加上相同条件限制排查未发现问题,还是同事帮看到了union 不是union all 的原因。数据量少的情况下数据没有重复,金额四位小数重复,当数据量大的情况下会出现很多一模一样的金额,这时候区别就出来了。union 把一样的金额去重,只剩下部分数据,而union all完全保留结果会是全部的,就统计数据而言应该用union all。
既然数据的问题解决了,还引发个新的疑惑,两者都用union的情况下,哪个效率会高一点,应该用哪个SQL,数据处理顺序有什么差异。这里记录一下个人看法。
在比较方法一和方法二的效率时,一般来说,方法二更可能是更高效的选择。
总体而言,方法二可能更高效,特别是在数据量较小或者需要简单逻辑的情况下。但是在涉及大数据量和需要减少数据传输量的情况下,方法一可能更有效。最佳选择取决于具体情况和需求。在实际应用中,可以根据数据量大小、性能要求等因素进行测试和选择最合适的方法。
除此之外可查看SQL对应的执行计划分析两者的区别