在做用例移植的过程中,遇到了针对同一个嵌套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的运行结果为
dm8数据库运行结果为
为验证结果的准确性,在oracle23里同样进行了测试,运行结果为
从结果集中可以看出,dm8的运行结果与oracle23的运行结果保持一致。
语义分析
从嵌套查询语句的语义来看,最外层为select ... from t2,最终结果行数应与t2表一致,有两行,而mysql的查询结果与sql语义相矛盾。
结果集分析
针对不同数据库的运行结果,我们进行了分析。
验证
向表t1中再次插入一行数据
insert into t1 values(2);
dm8和oracle23语句运行结果为
mysql8的运行结果为
结果集分析
对于 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
文章
阅读量
获赞
