TDengine中UNION ALL交换子查询顺序结果不一致问题咨询
TDengine UNION ALL顺序导致结果不一致问题解答
根因说明
该现象是TDengine v2.0.x到v2.2.x版本区间存在的内核逻辑bug,触发规则如下:
- UNION ALL算子执行时按语句书写顺序优先处理第一个子查询
- 若第一个子查询返回空结果集,内核会直接终止后续所有子查询的执行,直接返回空结果
- 仅当第一个子查询存在返回数据时,才会继续拼接后续子查询的结果集
你提交的两个查询正好命中该逻辑:
- 第一个UNION ALL语句的首个子查询返回6行统计数据,第二个子查询返回空,最终输出6行数据
- 第二个UNION ALL语句的首个子查询返回空,内核直接终止执行,最终返回0行结果
修复方案
- 直接升级TDengine服务端到v2.3.0.0及以上版本,该版本已彻底修复UNION ALL空结果集处理逻辑
- 若暂时无法升级,可在可能返回空的子查询前新增一条结构匹配的保底dummy查询,示例如下:
select 0 as count, '' as loc where 1=0 union all select count(*) as count, loc from st where ts between 1600000000020 and 1600000000030 group by loc union all select count(*) as count, loc from st where ts between 1600000000000 and 1600000000010 group by loc;
该dummy查询永远返回空,且结构与后续查询一致,不会影响最终结果,同时可以规避首个子查询为空导致的bug。
补充:你执行结果中出现重复
loc列的问题,也是同一版本区间的元数据解析bug,升级到v2.3以上版本后会一并修复。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

