Redshift中使用子查询IN结合IS NULL条件报错的求助
Redshift中IN子查询加OR IS NULL报错的替代解决方案
方案1:使用LEFT JOIN替代IN子查询逻辑
通过LEFT JOIN关联两张表,将原条件转化为匹配到T2记录或field3为NULL的情况,用DISTINCT避免重复结果:
SELECT DISTINCT T.field1, T.field2 FROM table T LEFT JOIN T2 ON T.field3 = T2.col WHERE condition1 AND condition2 AND (T2.col IS NOT NULL OR T.field3 IS NULL)
方案2:用EXISTS替代IN子查询
Redshift对EXISTS的执行计划处理逻辑与IN不同,可尝试保留原结构的同时替换IN为EXISTS:
SELECT field1, field2 FROM table T WHERE condition1 AND condition2 AND (EXISTS (SELECT 1 FROM T2 WHERE T2.col = T.field3) OR T.field3 IS NULL)
方案3:拆分逻辑为UNION ALL合并结果
将原查询拆分为两个独立部分:匹配T2记录的结果集,加上field3为NULL且未匹配T2的结果集,用UNION ALL合并避免重复:
SELECT field1, field2 FROM table T WHERE condition1 AND condition2 AND T.field3 IN (SELECT col FROM T2) UNION ALL SELECT field1, field2 FROM table T WHERE condition1 AND condition2 AND T.field3 IS NULL AND NOT EXISTS (SELECT 1 FROM T2 WHERE T2.col = T.field3)
说明
原语句报错context: query->a_last_plan()->m_locus == LocusXNode大概率是Redshift查询优化器处理IN子查询 + OR IS NULL组合时的内部bug,上述方案均无需修改T2数据,通过调整查询逻辑绕开优化器问题,同时完全保留原业务逻辑的正确性。
内容的提问来源于stack exchange,提问作者Marcio Buss
相关产品推荐
相关产品推荐

