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

【问题如下】

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

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

MySQL8.0+问题(WITH查询,UNION ALL以后执行结果出错)_第1张图片

--  无记录
SELECT * FROM VIEW_THREE_4

MySQL8.0+问题(WITH查询,UNION ALL以后执行结果出错)_第2张图片

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

MySQL8.0+问题(WITH查询,UNION ALL以后执行结果出错)_第3张图片

【预期如下】

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

MySQL8.0+问题(WITH查询,UNION ALL以后执行结果出错)_第4张图片

你可能感兴趣的:(MySQL-应用,sql,数据库,mysql)