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

如何不使用UNION ALL,在查询中定义行来创建CTE?

SQL语法问题:CTE无法插入数据,寻求更简洁的临时表实现方式

我的尝试

我想实现类似临时表的操作,但以下两种CTE写法都不符合预期:

第一种写法(仅查询CTE):

WITH cte_name (dog, name) AS (
VALUES
  ('dog1', 'name1'),
  ('dog2', 'name2'),
  ('dog3', 'name3'),
  ('dog4', 'name4'),
  ('dog5', 'name5')
)
SELECT * FROM cte_name;

第二种写法(尝试向CTE插入数据,执行报错):

WITH A AS (
    SELECT '2023-11-01' AS date, 'November' AS month
)
INSERT INTO A (date, month)
VALUES ('2023-10-01',  'October')

我找到了一种可行方法,但希望有更简洁的实现:

CREATE TEMPORARY TABLE A AS (
    SELECT '2023-11-01' AS date, 'November' AS month
);
INSERT INTO A (date, month)
VALUES ('2023-10-01',  'October')

解决方案

核心原因

CTE(公共表表达式)是只读的临时结果集,并非可写入的表对象,所以无法直接执行INSERT INTO CTE操作,这是第二种写法报错的根本原因。

更简洁的实现方式

根据不同使用场景,提供两种简洁写法:

场景1:一次性创建临时表并填充所有数据

如果不需要后续追加数据,直接把初始行和新增行合并写入临时表:

CREATE TEMPORARY TABLE A AS
WITH init_data AS (
    SELECT '2023-11-01' AS date, 'November' AS month
)
SELECT * FROM init_data
UNION ALL
SELECT '2023-10-01', 'October';

或者更直接的写法(PostgreSQL、MySQL 8.0+等多数数据库支持):

CREATE TEMPORARY TABLE A (date DATE, month VARCHAR(20)) AS
VALUES
    ('2023-11-01', 'November'),
    ('2023-10-01', 'October');

场景2:需要后续继续向临时表插入数据

如果创建临时表后还要追加数据,你原本的写法已经很简洁,也可以进一步简化成:

CREATE TEMPORARY TABLE A AS SELECT '2023-11-01' AS date, 'November' AS month;
INSERT INTO A VALUES ('2023-10-01', 'October');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:22:24