如何合并含distkey的三个SQL查询且无需创建临时表?
问题描述
现有两个源数据表:
表1:original_xyz
| uuid | lang | name | text | abc | ijk |
|---|---|---|---|---|---|
| 1231312 | en | general | this is a foo bar | 0.23 | 8 |
| 1231312 | en | general | this is a foo bar | 0.93 | 58 |
| 9890803 | en | general | another sent | 0.38 | 29 |
表2:qqq(原问题未明确表名,此处为临时命名)
| uuid | trg_lang | rst |
|---|---|---|
| 1231312 | de | 0.95 |
| 1231312 | de | 0.34 |
原本的处理流程是创建两个临时表后执行关联查询:
创建临时表new_xyz
CREATE temp TABLE new_xyz sortkey( uuid, lang, name, text ) distkey(uuid) as ( SELECT uuid, lang, name, text, min(abc) as abcs, sum(ijk) as ijks FROM original_xyz GROUP BY 1,2,3,4 ORDER BY 1,2,3,4 )
创建临时表new_qqq
CREATE temp TABLE new_qqq sortkey( uuid, trg_lang ) distkey(uuid) as ( SELECT uuid, trg_lang, min(rst) as rsts FROM qqq GROUP BY 1,2 )
最终关联查询
SELECT * from new_xyz nxyz INNER JOIN new_qqq nqqq ON nxyz.uuid = nqqq.uuid
执行后得到结果表:
| uuid | lang | name | text | abc | ijk | trg_lang | rst |
|---|---|---|---|---|---|---|---|
| 1231312 | en | general | this is a foo bar | 0.23 | 66 | de | 0.34 |
现在需要将这三个查询合并为一个,不创建临时表,通过子查询关联实现。
解决方案
完全可以合并为单个查询,无需创建临时表。将原临时表的聚合逻辑作为子查询直接关联即可,Redshift会自动处理查询执行计划,子查询中不需要显式指定distkey或sortkey(这类是表的存储属性,子查询为内存临时计算结果,无需额外配置)。
合并后的完整SQL如下:
SELECT nxyz.uuid, nxyz.lang, nxyz.name, nxyz.text, nxyz.abcs AS abc, nxyz.ijks AS ijk, nqqq.trg_lang, nqqq.rsts AS rst FROM ( SELECT uuid, lang, name, text, min(abc) as abcs, sum(ijk) as ijks FROM original_xyz GROUP BY 1,2,3,4 ORDER BY 1,2,3,4 ) nxyz INNER JOIN ( SELECT uuid, trg_lang, min(rst) as rsts FROM qqq -- 替换为实际表名 GROUP BY 1,2 ) nqqq ON nxyz.uuid = nqqq.uuid
说明
- 两个子查询分别对应原临时表的聚合逻辑:
- 第一个子查询对
original_xyz按uuid, lang, name, text分组,计算abc的最小值和ijk的总和; - 第二个子查询对目标表按
uuid, trg_lang分组,计算rst的最小值;
- 第一个子查询对
- 通过
uuid关联两个子查询结果,输出与原流程完全一致的内容; - 原临时表的
distkey和sortkey是针对物理存储的优化配置,子查询无需指定,Redshift会根据查询逻辑自动优化数据分布与排序,保障执行效率。
内容的提问来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

