You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一条SQL查询中使用多个WITH语句和多个INSERT语句

报错根本原因

你写的WITH子句定义的CTE(公共表表达式)作用域仅属于它后面紧跟的第一条SQL语句。你拆分了两条独立的INSERT语句,第一条INSERT执行完成后,你定义的table_1_items和table_2_items就会被销毁,第二条INSERT自然找不到table_2_items关系。


方案1:使用可写CTE整合为单条语句(适配PostgreSQL等支持该特性的数据库)

支持数据修改类CTE的数据库,可以把多个插入动作都整合到同一条WITH语句的上下文中,修改后的写法如下:

WITH table_1_items AS (
  SELECT * FROM example_table_1
),
table_2_items AS (
  SELECT * FROM example_table_2
),
-- 第一个插入作为CTE的一部分执行
insert_1 AS (
  INSERT INTO other_table_1 SELECT * FROM table_1_items
)
-- 最后执行第二个插入作为主语句
INSERT INTO other_table_2 SELECT * FROM table_2_items;

注意:你原写法里INSERT INTO xxx FROM xxx不是标准SQL语法,需要补全SELECT *改为INSERT INTO xxx SELECT * FROM xxx。


方案2:使用临时表适配所有数据库

如果你的数据库不支持可写CTE,可以改用临时表存储查询结果,临时表的生命周期覆盖当前会话/整个事务,可被多条INSERT语句调用:

-- 创建临时表存储两个查询的结果
CREATE TEMP TABLE table_1_items AS SELECT * FROM example_table_1;
CREATE TEMP TABLE table_2_items AS SELECT * FROM example_table_2;

-- 顺序执行插入操作
INSERT INTO other_table_1 SELECT * FROM table_1_items;
INSERT INTO other_table_2 SELECT * FROM table_2_items;

-- 临时表会在会话结束后自动清理,也可手动删除
DROP TABLE IF EXISTS table_1_items, table_2_items;

内容的提问来源于stack exchange,提问作者wilsonpage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:54:02