Redshift子查询报错:查询不在tableA但在tableB中的表失败
Redshift中NOT IN查询报错的原因与解决
核心问题分析
- NULL值导致的逻辑失效:Redshift严格遵循SQL三值逻辑,若子查询
terry.table_count的table_name字段存在NULL值,NOT IN会因UNKNOWN逻辑返回空结果甚至触发报错。Oracle在处理此类场景时的逻辑兼容度更高,不会出现该问题。 - Schema未限定引发的匹配错误:
information_schema.tables包含所有Schema下的表,未指定table_schema会导致跨Schema的同名表干扰匹配;同时Redshift默认表名以小写存储,若Oracle中表名是大写格式,会出现大小写不匹配的隐性错误。 - Redshift对information_schema的权限/范围限制:未限定Schema的
information_schema.tables查询可能返回无权限访问的系统表,触发权限类报错。
修正方案
方案1:改用NOT EXISTS(推荐,跨库兼容)
SELECT tab.table_name FROM information_schema.tables tab WHERE tab.table_schema = 'terry' AND NOT EXISTS ( SELECT 1 FROM terry.table_count tc WHERE tc.table_name = tab.table_name );
方案2:过滤子查询中的NULL值
SELECT tab.table_name FROM information_schema.tables tab WHERE tab.table_schema = 'terry' AND tab.table_name NOT IN ( SELECT tc.table_name FROM terry.table_count tc WHERE tc.table_name IS NOT NULL );
额外注意事项
- 若存在表名大小写不一致的情况,统一用
LOWER()转换:WHERE LOWER(tc.table_name) = LOWER(tab.table_name) - 限定
table_schema可缩小查询范围,既提升性能又避免无关表干扰。
内容的提问来源于stack exchange,提问作者Terry Jensen
相关产品推荐
相关产品推荐

