DB2 V10/V11 SQL查询结果异常:预期2条实际3条求助
DB2 10/11 SQL查询异常原因及解决方法
异常原因
在DB2 10和11版本中,优化器处理**同一个CTE被UNION多个分支引用,且其中一个分支包含恒假过滤条件(如1=0)**时存在逻辑bug:原本应返回空集的分支,优化器错误地忽略了恒假条件,导致该分支返回CTE的完整数据集。
对应到你的SQL:
- CTE
T的结果是ID=1、2、3 - 第一个分支
SELECT ID FROM T WHERE ID IN(2,3)返回2、3 - 第二个分支因优化器bug,未执行
1=0的过滤,返回1、2、3 - 最终
UNION去重后得到1、2、3,共3行,与预期不符。
解决方法
方法1:避免在空分支中引用CTE
直接构造空集替代对CTE的引用,确保分支返回空:
WITH T AS(SELECT ID FROM(SELECT ID FROM (VALUES(1),(2),(3)) T(ID)GROUP BY ID) WHERE ID IN(1,2,3)) SELECT ID FROM T WHERE ID IN(2,3) UNION SELECT ID FROM (VALUES()) AS DUMMY(ID)
方法2:合并分支逻辑,移除UNION
将两个分支的条件合并为一个查询,无需使用UNION:
WITH T AS(SELECT ID FROM(SELECT ID FROM (VALUES(1),(2),(3)) T(ID)GROUP BY ID) WHERE ID IN(1,2,3)) SELECT ID FROM T WHERE ID IN(2,3) OR 1=0
方法3:升级DB2版本
该优化器bug在DB2 12及以上版本中已被修复,升级后可直接使用原SQL得到正确结果。
内容的提问来源于stack exchange,提问作者wusc
相关产品推荐
相关产品推荐

