今天在项目开发中遇到一个关于union all函数使用的数据缺失问题,具体代码如下

理论上的结果应该是含有个人所有类别的所有有效时间和无效时间的结果集,如下图所示

上图两个红框标识两个类型

但实际的结果为union all下面(除2999-99-99的数据全丢失)的代码数据丢失,如下图

由图可以看出,union all底下代码数据已经丢失,将union all上下代码换一下位置再执行,结果如下

由图能看出,2999-99-99的数据全部丢失,单独运行两段代码,即不合并时数据全部存在,此处不再截图演示;在试过数据格式显示转换cast()、核对字段名称对应正确的情况下依旧如此,最后想到可能和此次开发使用CTE有关(即将中间结果临时保存在内存中,可以理解为临时表),针对这个猜想修改代码如下

按照这次代码修改显示为了正确的结果,如下图(红框为验证数据所加代码,可省略);

总结:根据以上问题不难发现,此次union all函数底下代码的缺失和CTE有关,可以理解为在union all都是查询c这个临时表时,第一次相当于查询后修改了c这张临时表的结构,当按照第一次相当于将c变成只有lead_time为null的数据结构表,底下再查询c无法查询到其他非2999-99-99的数据;再调换位置后再采用union all相当于少了lead_time这个字段的值,后期无法查出其他值,所以采用底下的分开查询可以避免这类错误。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐