Union和union导致的数据不一致

平时工作中经常用到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,数据处理顺序有什么差异。这里记录一下个人看法。
在比较方法一和方法二的效率时,一般来说,方法二更可能是更高效的选择。

方法一的优点:

  • 减少数据传输量:在每张表内部进行 SUM 可以减少需要传输的数据量,因为只传输每张表的汇总值。
  • 减少最外层聚合计算:最外层只需要对少量的汇总结果进行 SUM,而不是对整个数据集进行聚合计算。

方法一的缺点:

  • 多次聚合计算:需要在每张表内部进行 SUM,可能会导致多次聚合计算,特别是当数据量很大时,这可能会影响性能。

方法二的优点:

  • 单一聚合计算:只需要在最外层对合并后的数据进行一次 SUM,减少了多次聚合计算的开销。
  • 简单:逻辑相对简单,不需要在每张表内部进行额外的聚合计算。

方法二的缺点:

  • 传输整个数据集:需要传输所有数据到最外层进行汇总,可能会导致数据传输量较大。

总体而言,方法二可能更高效,特别是在数据量较小或者需要简单逻辑的情况下。但是在涉及大数据量和需要减少数据传输量的情况下,方法一可能更有效。最佳选择取决于具体情况和需求。在实际应用中,可以根据数据量大小、性能要求等因素进行测试和选择最合适的方法。

除此之外可查看SQL对应的执行计划分析两者的区别

相关推荐

  1. Unionunion导致数据一致

    2024-03-15 09:54:04       22 阅读
  2. UNION UNION ALL

    2024-03-15 09:54:04       41 阅读
  3. sqlserver union union all

    2024-03-15 09:54:04       29 阅读
  4. struct union 区别?

    2024-03-15 09:54:04       20 阅读
  5. MySQL中unionunion all区别

    2024-03-15 09:54:04       44 阅读
  6. MySQL中UNIONUNION ALL区别有哪些?

    2024-03-15 09:54:04       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-15 09:54:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-15 09:54:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-15 09:54:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-15 09:54:04       20 阅读

热门阅读

  1. pxe安装mini centos系统

    2024-03-15 09:54:04       19 阅读
  2. 【备忘录】kafka常用命令维护

    2024-03-15 09:54:04       18 阅读
  3. postman学习

    2024-03-15 09:54:04       16 阅读
  4. html5&css&js代码 011 个人简历二

    2024-03-15 09:54:04       19 阅读
  5. c 语言stdlib.h介绍

    2024-03-15 09:54:04       18 阅读
  6. Spring Boot 事务管理(事务失效常见场景)

    2024-03-15 09:54:04       18 阅读
  7. Python中的区块链技术与应用

    2024-03-15 09:54:04       20 阅读
  8. 每日OJ题_简单多问题dp①_力扣LCR 089. 打家劫舍

    2024-03-15 09:54:04       19 阅读
  9. ChatGPT创造力与创新探究

    2024-03-15 09:54:04       20 阅读