Redshift不支持IN/NOT IN查询,如何用NOT EXISTS改写?
Redshift IN/NOT IN查询报错的NOT EXISTS改写方案
针对Redshift抛出的[XX000] ERROR: This type of IN/NOT IN query is not supported yet in Redshift错误,完全可以将NOT IN部分改写为NOT EXISTS形式来规避。如果IN常量列表也触发问题,同样可以用EXISTS替代。
改写后的完整WHERE子句
WHERE ns.campaign_name IN ('LNG_CS_NA_AC', 'LNG_CS_NA_BIS', 'LNG_CS_NA_CANADA', 'LNG_CS_NA_EROD', 'LNG_CS_NA_InterAction', 'LNG_CS_NA_Interaction_UK', 'LNG_CS_NA_NFL', 'LNG_CS_NA_PDS', 'LNG_CS_NA_TECH', 'LNG_CS_NA_UK', 'LNG_CS_UK', 'LNG_CSAPAC_Asia', 'LNG_CSAPAC_AU_NZ_CS', 'LNG_CSAPAC_AU_NZ_ES', 'LNG_CSAPAC_AU_NZ_Helpline', 'LNG_CSAPAC_AU_NZ_SALES_ENABLEMENT', 'LNG_CSAPAC_AU_NZ_Tech_Sup', 'LNG_CSAPAC_AUNZ', 'LNG_CSAPAC_India_Gurugram', 'LNG_CSAPAC_Japan_Tokyo', 'LNG_CSAPAC_Korea_Seoul', 'LNG_CSUK', 'LNG_CSUK_MLEX', 'LNG_GOTC_UK', 'LNG_CS_EMEA_CS') -- 'LNG_APAC_Finance' AND ns.skill_name NOT LIKE 'cert%' AND NOT EXISTS ( SELECT 1 FROM (VALUES ('APAC_FINANCE_MY'), ('APAC_FINANCE_INDIA'), ('APAC_FINANCE_SG') ) AS excluded_skills(skill) WHERE excluded_skills.skill = ns.skill_name ) AND ns.contact_start_dts > '2019-12-31 23:59:59'
若IN列表也触发报错的替代写法
如果campaign_name的IN常量列表同样引发错误,可将其替换为EXISTS形式:
AND EXISTS ( SELECT 1 FROM (VALUES ('LNG_CS_NA_AC'), ('LNG_CS_NA_BIS'), ('LNG_CS_NA_CANADA'), ('LNG_CS_NA_EROD'), ('LNG_CS_NA_InterAction'), ('LNG_CS_NA_Interaction_UK'), ('LNG_CS_NA_NFL'), ('LNG_CS_NA_PDS'), ('LNG_CS_NA_TECH'), ('LNG_CS_NA_UK'), ('LNG_CS_UK'), ('LNG_CSAPAC_Asia'), ('LNG_CSAPAC_AU_NZ_CS'), ('LNG_CSAPAC_AU_NZ_ES'), ('LNG_CSAPAC_AU_NZ_Helpline'), ('LNG_CSAPAC_AU_NZ_SALES_ENABLEMENT'), ('LNG_CSAPAC_AU_NZ_Tech_Sup'), ('LNG_CSAPAC_AUNZ'), ('LNG_CSAPAC_India_Gurugram'), ('LNG_CSAPAC_Japan_Tokyo'), ('LNG_CSAPAC_Korea_Seoul'), ('LNG_CSUK'), ('LNG_CSUK_MLEX'), ('LNG_GOTC_UK'), ('LNG_CS_EMEA_CS') ) AS target_campaigns(campaign) WHERE target_campaigns.campaign = ns.campaign_name )
另一种替代方案:LEFT JOIN + IS NULL
除了NOT EXISTS,也可以用LEFT JOIN结合IS NULL的方式实现NOT IN的逻辑,效果一致:
-- 在FROM子句中添加LEFT JOIN LEFT JOIN (VALUES ('APAC_FINANCE_MY'), ('APAC_FINANCE_INDIA'), ('APAC_FINANCE_SG') ) AS excluded_skills(skill) ON excluded_skills.skill = ns.skill_name -- 在WHERE子句中添加 AND excluded_skills.skill IS NULL
内容的提问来源于stack exchange,提问作者Richie Quinsayas
相关产品推荐
相关产品推荐

