首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >26ai新特性实战:WITH子句嵌套

26ai新特性实战:WITH子句嵌套

作者头像
胖头鱼的鱼缸
发布2026-07-07 14:50:09
发布2026-07-07 14:50:09
50
举报
914fcc7ad57defa7868c3be1ca7fb4f5.jpg
914fcc7ad57defa7868c3be1ca7fb4f5.jpg

特性介绍

Oracle AI Database 23.26.2 解除了此前对 WITH 子句嵌套的限制,现在支持在其他 WITH 子句内部嵌套 WITH 子句,并允许在 WITH 子句有效的任何位置使用。

此前的限制

  • WITH 子句(CTE,公共表表达式)只能在查询的最外层定义
  • 子查询内部不能使用 WITH 子句
  • WITH 子句内部不能再嵌套 WITH 子句

新特性允许

  • 在 WITH 子句的 SELECT 主体中定义内层 WITH 子句
  • 在 FROM 子句的子查询中使用 WITH 子句
  • 在 INSERT … SELECT 中使用嵌套 WITH 子句
  • 内层 WITH 子句引用外层 WITH 子句的数据(关联引用)
  • 多层嵌套(三层及以上)

仍然不支持的

  • 递归嵌套(WITH 内部直接引用自身)
  • 嵌套 WITH 子句内部定义 PL/SQL 函数
  • 嵌套 WITH 子句内部使用表值构造器(Table Value Constructors)

关于内联提示:现有提示(inline/materialize)仍可使用,但在嵌套场景下可能被忽略,不影响非嵌套查询块的行为。

适用场景

  • 复杂报表:将多步骤的数据转换逻辑分解为层次化的 CTE,提高可读性
  • 数据管道:在 INSERT … SELECT 中使用嵌套 WITH 实现复杂的数据加工
  • 分析查询:对中间结果进行排名后分类,避免重复子查询
  • 代码复用:将公共计算逻辑封装在内层 WITH 中,供外层多处引用
  • 迁移兼容:从 PostgreSQL、SQL Server 等支持嵌套 CTE 的数据库迁移

实战演示

同之前一样,使用用户NFTEST,已授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。

创建测试表并添加测试数据

代码语言:javascript
复制
CREATE TABLE nwc_sales (
  sale_id   NUMBER PRIMARY KEY,
  product   VARCHAR2(30),
  region    VARCHAR2(30),
  amount    NUMBER,
  sale_date DATE
);

INSERT INTO nwc_sales VALUES (1, 'Widget', 'East', 100, DATE'2026-01-15');
INSERT INTO nwc_sales VALUES (2, 'Widget', 'West', 150, DATE'2026-01-20');
INSERT INTO nwc_sales VALUES (3, 'Gadget', 'East', 200, DATE'2026-02-10');
INSERT INTO nwc_sales VALUES (4, 'Gadget', 'West', 120, DATE'2026-02-15');
INSERT INTO nwc_sales VALUES (5, 'Widget', 'East',  80, DATE'2026-03-01');
INSERT INTO nwc_sales VALUES (6, 'Gadget', 'West', 300, DATE'2026-03-05');

COMMIT;
image.png
image.png

测试1:基本测试

在一个WITH子句中嵌套的WITH子句

代码语言:javascript
复制
WITH outer_cte AS (
WITH inner_cte AS (
SELECT product, region, SUM(amount) AS region_total
FROM nwc_sales
GROUP BY product, region
  )
SELECT product, SUM(region_total) AS total,
MAX(region_total) AS top_region_total
FROM inner_cte
GROUP BY product
)
SELECT product, total, top_region_total
FROM outer_cte
ORDER BY total DESC;
image.png
image.png

测试2:多层嵌套

3层:

  • 第一级:按产品和区域分类的销售
  • 第二级:对产品内的区域进行排名(包含嵌套的WITH语句)
代码语言:javascript
复制
WITH level1 AS (
SELECT product, region, SUM(amount) AS region_total
FROM nwc_sales GROUP BY product, region
),
level2 AS (
WITH region_rank AS (
SELECT product, region, region_total,
RANK() OVER (PARTITIONBY product ORDER BY region_total DESC) AS rnk
FROM level1
  )
SELECT product, region, region_total, rnk
FROM region_rank
)
SELECT product, region, region_total,
CASEWHEN rnk = 1 THEN'TOP' ELSE 'OTHER' END AS tier
FROM level2
ORDE RBY product, rnk;
image.png
image.png

测试3:在带有相关性的FROM子句子查询中嵌套使用WITH

代码语言:javascript
复制
WITH outer_cte AS (
SELECT product, SUM(amount) AS total
FROM nwc_sales GROUP BY product
)
SELECT sub.product, sub.total, sub.sale_count
FROM (
WITH inner_cte AS (
SELECT product, COUNT(*) AS sale_count
FROM nwc_sales GROUP BY product
  )
SELECT o.product, o.total, i.sale_count
FROM outer_cte o JOIN inner_cte i ON o.product = i.product
) sub
ORDER BY sub.total DESC;
image.png
image.png

测试4:在insert into中嵌套WITH子句

代码语言:javascript
复制
CREATETABLE nwc_summary (
  product   VARCHAR2(30),
  total     NUMBER,
  avg_sale  NUMBER,
  num_sales NUMBER
);

INSERT INTO nwc_summary
WITH product_stats AS (
WITH sale_details AS (
SELECT product, SUM(amount) AS total, AVG(amount) AS avg_amt, COUNT(*) AS num_sales
FROM nwc_sales GROUP BY product
  )
SELECT * FROM sale_details
)
SELECT product, total, avg_amt, num_sales FROM product_stats;

COMMIT;

-- 验证数据
SELECT product, total, avg_sale, num_sales
FROM nwc_summary;
image.png
image.png

总结

本期对Oracle AI Database 26ai,23.26.2版本新引入的WITH子句嵌套进行了完整介绍与实战演示。

老规矩,知道写了些啥。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 胖头鱼的鱼缸 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 特性介绍
  • 适用场景
  • 实战演示
    • 创建测试表并添加测试数据
    • 测试1:基本测试
    • 测试2:多层嵌套
    • 测试3:在带有相关性的FROM子句子查询中嵌套使用WITH
    • 测试4:在insert into中嵌套WITH子句
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档