注册
嵌套SUMsql语句运行结果分析
培训园地/ 文章详情 /

嵌套SUMsql语句运行结果分析

。。。 2025/10/11 184 0 0

在做用例移植的过程中,遇到了针对同一个嵌套SELECT语句,不同数据库运行结果不一致的情况。

create table t1(pk int);
create table t2(pk int,c1 char(20));
insert into t1 values(1);
insert into t2 values(1,'1'),(2,'2');
select (select sum((select sum(c1) from t1)) from t1) from t2;

其中mysql8的运行结果为
image.png
dm8数据库运行结果为
image.png
为验证结果的准确性,在oracle23里同样进行了测试,运行结果为
image.png
从结果集中可以看出,dm8的运行结果与oracle23的运行结果保持一致。
语义分析
从嵌套查询语句的语义来看,最外层为select ... from t2,最终结果行数应与t2表一致,有两行,而mysql的查询结果与sql语义相矛盾。
结果集分析
针对不同数据库的运行结果,我们进行了分析。

  1. 在mysql中:
    内层的sum(c1) 是对 t2.c1 求和,由于 c1 是 char(20) 类型,MySQL 会隐式转换为数值('1'→1,'2'→2),sum(c1) = 1 + 2 = 3。
    中间层子查询 (select sum(...) from t1),括号内的结果是固定值 3(来自最内层),因此变为 select sum(3) from t1。t1有1行数据,sum(3)本质是对 “常量 3” 求和(共1行),即结果为3。
    最外层查询 select (...) from t2,中间层结果是固定值3,因此变为 select 3 from t2,最终返回3。
  2. 在dm8和oracle23中
    1. 最内层子查询:select sum(c1) from t1
      对于t2的每一行:
      第一行:c1='1'→ sum('1')= 1
      第二行:c1='2'→ sum('2')= 2
    2. 中间层子查询:select sum(...) from t1
      将最内层的结果作为输入:
      对于t2第一行:select sum(1) from t1→ t1有1行 → 结果1
      对于t2第二行:select sum(2) from t1→ t1有1行 → 结果2
    3. 最外层查询:select ... from t2
      对t2的每一行执行上述计算
      第一行结果:1
      第二行结果:2

验证
向表t1中再次插入一行数据

insert into t1 values(2);

dm8和oracle23语句运行结果为
image.png
mysql8的运行结果为
image.png
结果集分析
对于 t2的第一行 (pk=1, c1='1'):
最内层子查询:select sum(c1) from t1
c1不在 t1中,引用外层 t2的 c1值 '1'
对 t1的每一行都返回 '1'
sum('1')计算:'1' (第一行) + '1' (第二行) = 2
中间层子查询:select sum(2) from t1
常量 2 在 t1的每一行上求和
2 (第一行) + 2 (第二行) = 4
结果:4
对于 t2的第二行 (pk=2, c1='2'):
最内层子查询:select sum(c1) from t1
引用 t2的 c1值 '2'
'2' (第一行) + '2' (第二行) = 4
中间层子查询:select sum(4) from t1
4 (第一行) + 4 (第二行) = 8
结果:8

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服