无需CTE:能否用CREATE TEMP TABLE AS替代手动建临时表存MERGE返回结果?
解答
当然可以,既不需要使用CTE,也能通过CREATE TEMP TABLE temp AS语句直接将MERGE操作的返回结果存入临时表,无需手动提前定义临时表结构。
调整后的代码
针对你提供的场景,改写后的写法如下(适配支持MERGE语法的主流数据库,如PostgreSQL 15+、Snowflake、Oracle等):
CREATE TEMP TABLE temp AS MERGE INTO wines w USING wines_updates u ON u.winery_id = w.winery_id WHEN MATCHED THEN UPDATE SET stock = u.stock RETURNING merge_action() AS action, w.winery_id, w.brand;
关键说明
- 这种写法无需提前手动创建临时表:数据库会自动根据
RETURNING子句返回的字段类型、名称自动生成临时表的结构,省去了手动定义字段的步骤,减少结构不一致的风险。 - 完全不需要CTE:MERGE操作本身的
RETURNING结果可以直接作为CREATE TEMP TABLE ... AS的数据源,不需要额外的CTE包裹。 - 效果与原代码一致:临时表
temp会存储MERGE操作中所有匹配并被更新的记录,包含动作类型、酒庄ID和品牌信息。
测试验证
使用你提供的DDL初始化数据后,执行上述语句,查询temp表会得到以下结果:
| action | winery_id | brand |
|---|---|---|
| UPDATE | 1 | Cheapaux |
| UPDATE | 2 | Mediocret Sauvignon |
| UPDATE | 3 | Expensivau Blanc |
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

