Netezza关联子查询不支持报错:请求改写日期匹配SQL
解决Netezza关联子查询报错的跨表日期匹配SQL改写
改写思路
Netezza不支持原SQL中引用外部表字段的关联子查询,因此将子查询逻辑转换为JOIN关联形式,把表C的预处理结果作为独立数据集与表A、表B关联,实现相同的日期匹配逻辑。
原逻辑梳理
- 表A的
dt字段为YYYYMM格式(如202212) - 从表C中筛选
last_bus_day = 1的记录,将其date字段转换为YYYYMM格式后与表A的dt匹配,同时通过id关联表A和表B
改写后的SQL
完整匹配版(保留原yr、mth校验)
SELECT a.id, a.dt FROM table A INNER JOIN table B ON a.id = b.id INNER JOIN ( -- 预处理表C,得到符合条件的YYYYMM格式日期及对应年月 SELECT DISTINCT string_to_int(to_char(to_date(date, 'YYYY-MM-DD'), 'YYYYMM'), 10) AS c_dt, yr, mth FROM table C WHERE last_bus_day = 1 ) c ON a.dt = c.c_dt AND CAST(SUBSTR(a.dt, 5, 2) AS INTEGER) = c.mth AND SUBSTR(a.dt, 1, 4) = c.yr;
简化版(若表C的yr、mth与date字段年月一致)
如果表C的yr和mth字段与date字段的年月完全对应,可简化为:
SELECT a.id, a.dt FROM table A INNER JOIN table B ON a.id = b.id INNER JOIN ( SELECT DISTINCT string_to_int(to_char(to_date(date, 'YYYY-MM-DD'), 'YYYYMM'), 10) AS c_dt FROM table C WHERE last_bus_day = 1 ) c ON a.dt = c.c_dt;
说明
将原关联子查询转换为JOIN后,既规避了Netezza对关联子查询的限制,又完全保留了原SQL的业务逻辑,执行效率也更符合Netezza的优化特性。
内容的提问来源于stack exchange,提问作者Paula
相关产品推荐
相关产品推荐

