doris insert into和with as 合用

Apache Doris 的 INSERT INTO ... WITH AS(CTE)语法是支持的,但必须将 CTE 包裹在子查询中,或直接在 INSERT INTO ... SELECT 的 SELECT 部分使用,并建议显式指定 WITH LABEL。‌‌

  • ‌标准写法 ‌:INSERT INTO target_table WITH LABEL label_name WITH cte_name AS (...) SELECT ... FROM cte_name;
  • ‌兼容写法 ‌(若上述报错):INSERT INTO target_table SELECT * FROM (WITH cte_name AS (...) SELECT ...) AS sub;
  • Doris 要求 ‌CTE 必须作为 SELECT 的一部分 ‌,不能独立于 INSERT INTO ... SELECT 之外使用;
  • ‌**生产环境建议显式指定 WITH LABEL**‌,避免自动生成标签冲突;
  • CTE 支持多层定义(如 WITH cte1 AS (...), cte2 AS (SELECT ... FROM cte1)),但整个查询需在 SELECT 子句内;
  • 若启用 enable_insert_strict = true(默认),数据格式错误会导致整个插入失败。‌‌

示例:

复制代码
INSERT INTO target_tbl WITH LABEL 'my_cte_label' WITH tmp AS (SELECT id, name FROM source_tbl WHERE status = 'active') SELECT id, UPPER(name) FROM tmp; ```‌‌:ml-citation{ref="11,12" appearance="aggregated" data="citationList"} 如遇语法错误,可改用子查询包裹 CTE: ```sql INSERT INTO target_tbl SELECT * FROM ( WITH cte AS (SELECT ... FROM ...) SELECT ... FROM cte ) AS sub;

sql

INSERT INTO target_tbl WITH LABEL 'my_cte_label' WITH tmp AS (SELECT id, name FROM source_tbl WHERE status = 'active') SELECT id, UPPER(name) FROM tmp; ```‌‌:ml-citation{ref="11,12" appearance="aggregated" data="citationList"}

如遇语法错误,可改用子查询包裹 CTE: ```sql INSERT INTO target_tbl SELECT * FROM ( WITH cte AS (SELECT ... FROM ...) SELECT ... FROM cte ) AS sub;

Doris 2.0+ 对 CTE 在 DML 中的支持更稳定,旧版本(如 1.x)可能存在限制,建议升级或测试验证。

具体案例:

sql 复制代码
INSERT INTO cdn.edge_client_area_bandwidth_hour SELECT * FROM (
    with crossSet as (SELECT
    t.time  as time,
    CASE WHEN (n & 1)   = 0 THEN CAST(t.productId AS STRING) ELSE 'all' END AS productId,
    CASE WHEN (n & 2)   = 0 THEN t.cp                       ELSE 'all' END AS cp,
    CASE WHEN (n & 4)   = 0 THEN t.domain                   ELSE 'all' END AS domain,
    CASE WHEN (n & 8)   = 0 THEN t.clientArea               ELSE 'all' END AS clientArea,
    CASE WHEN (n & 16)  = 0 THEN t.ipProtocol               ELSE 'all' END AS ipProtocol,
    CASE WHEN (n & 32)  = 0 THEN t.clientOperator           ELSE 'all' END AS clientOperator,
    CASE WHEN (n & 64)  = 0 THEN t.provider                 ELSE 'all' END AS provider,
    CASE WHEN (n & 128) = 0 THEN t.orderId                 ELSE 'all' END AS orderId,
    CASE WHEN (n & 256) = 0 THEN t.sourceCode               ELSE 'all' END AS sourceCode,
    t.value
FROM cdn.edge_client_area_bandwidth_fivemin t 
CROSS JOIN (SELECT number AS n FROM numbers("number"="512")) numbers WHERE t.time >= '2026-05-02 09:05:00' and t.time <= '2026-05-02 09:05:00'),
  sumTab as (select crossSet.time, crossSet.productId, crossSet.cp, crossSet.domain, crossSet.clientArea, crossSet.ipProtocol, crossSet.clientOperator, crossSet.provider, crossSet.orderId, crossSet.sourceCode, sum(value) as sumValue from crossSet group by crossSet.time, crossSet.productId, crossSet.cp, crossSet.domain, crossSet.clientArea, crossSet.ipProtocol, crossSet.clientOperator, crossSet.provider, crossSet.orderId, crossSet.sourceCode)
select "2026-05-02 09:00:00", "bandwidthMinBiz", sumTab.cp, sumTab.productId, sumTab.provider, sumTab.clientArea, sumTab.domain,  sumTab.clientOperator,  sumTab.ipProtocol,  sumTab.orderId, sumTab.sourceCode, max(sumValue) from sumTab group by sumTab.productId, sumTab.cp, sumTab.domain, sumTab.clientArea, sumTab.ipProtocol, sumTab.clientOperator, sumTab.provider, sumTab.orderId, sumTab.sourceCode
) AS sub;
相关推荐
写后端的胖头鱼11 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
路远的数据库笔记11 小时前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba
樱花落木兰11 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
kaiyou202612 小时前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习
mjhcsp12 小时前
DeepSeek V4.1 Flash 批量处理效能实测
java·前端·数据库
ShineWinsu12 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
lie..12 小时前
30天从零开始学AI应用开发(Day 17):ChromaDB 上手:给本地文档建一个“外挂大脑”
数据库·人工智能·oracle
code_whiter13 小时前
01-MySQL数据库基础
数据库·mysql
weixin_3823952313 小时前
本地部署 ERP 选型记录:从 Excel 到轻量系统的这几年
数据库·人工智能·数据挖掘
2401_8914092614 小时前
期货量化用得上的几类行情数据:逐笔、Level2、分钟线和五档tick
数据库