MySQL8.0+问题(WITH查询,UNION ALL以后执行结果出错)

【问题如下】

WITH查询,UNION ALL以后导致执行结果出错

-- 2条记录,一条为0
SELECT * FROM VIEW_ONE_60 

在这里插入图片描述

--  无记录
SELECT * FROM VIEW_THREE_4

在这里插入图片描述

-- 2条记录,一条不为0
SELECT * FROM VIEW_ONE_60 
UNION ALL
SELECT * FROM VIEW_THREE_4

在这里插入图片描述

【预期如下】

UNION ALL 以后应该是2条记录,一条为0

SELECT * FROM VIEW_ONE_60 
UNION ALL
SELECT * FROM VIEW_THREE_4

【原因猜测】

有WITH块如下:
VIEW_ONE_6_11
VIEW_ONE_60_fz
VIEW_ONE_60
VIEW_THREE_4_fz
VIEW_THREE_4

VIEW_ONE_60:VIEW_ONE_60_fz左连接VIEW_ONE_6_11,AMOUNT=左表的AMOUNT-右表的AMOUNT
VIEW_THREE_4:VIEW_THREE_4_fz左连接VIEW_ONE_60,AMOUNT=左表的AMOUNT-右表的AMOUNT

猜测:
执行计划不是先找出VIEW_ONE_60的结果,再用此结果去关联VIEW_THREE_4,而且在最后做UNION ALL的时候,把两个WITH块中的SQL拆出来,按MySQL的理解做了执行顺序的调整,导致嵌套关联时没有按预期执行出结果。(具体原因待构建数据测试)

【解决方法】

有WITH块调整如下:
新增VIEW_ONE_60_R(用 VIEW_ONE_60 汇总 或 GROUP BY?生成,看具体需求)
新增VIEW_THREE_4_R(用 VIEW_THREE_4 汇总 或 GROUP BY?生成,看具体需求)
最后再UNION ALL

SELECT * FROM VIEW_ONE_60_R
UNION ALL
SELECT * FROM VIEW_THREE_4_R

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值