【问题如下】
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