最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
26ai新特性实战:WITH子句嵌套详解
时间:2026-07-08 11:28:59 编辑:袖梨 来源:一聚教程网
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),regionVARCHAR2(30),amountNUMBER,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
测试1:基本测试
在一个WITH子句中嵌套的WITH子句
代码语言:javascript复制WITH outer_cte AS (WITH inner_cte AS (SELECT product, region, SUM(amount) AS region_totalFROM nwc_salesGROUP BY product, region)SELECT product, SUM(region_total) AS total,MAX(region_total) AS top_region_totalFROM inner_cteGROUP BY product)SELECT product, total, top_region_totalFROM outer_cteORDER BY total DESC;
image.png
测试2:多层嵌套
3层:
第一级:按产品和区域分类的销售第二级:对产品内的区域进行排名(包含嵌套的WITH语句)代码语言:javascript复制WITH level1 AS (SELECT product, region, SUM(amount) AS region_totalFROM 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 rnkFROM level1)SELECT product, region, region_total, rnkFROM region_rank)SELECT product, region, region_total,CASEWHEN rnk = 1 THEN'TOP' ELSE 'OTHER' END AS tierFROM level2ORDE RBY product, rnk;
image.png
测试3:在带有相关性的FROM子句子查询中嵌套使用WITH
代码语言:javascript复制WITH outer_cte AS (SELECT product, SUM(amount) AS totalFROM nwc_sales GROUP BY product)SELECT sub.product, sub.total, sub.sale_countFROM (WITH inner_cte AS (SELECT product, COUNT(*) AS sale_countFROM nwc_sales GROUP BY product)SELECT o.product, o.total, i.sale_countFROM outer_cte o JOIN inner_cte i ON o.product = i.product) subORDER BY sub.total DESC;
image.png
测试4:在insert into中嵌套WITH子句
代码语言:javascript复制CREATETABLE nwc_summary (product VARCHAR2(30),total NUMBER,avg_saleNUMBER,num_sales NUMBER);INSERT INTO nwc_summaryWITH product_stats AS (WITH sale_details AS (SELECT product, SUM(amount) AS total, AVG(amount) AS avg_amt, COUNT(*) AS num_salesFROM 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_salesFROM nwc_summary;
image.png
总结
本期对Oracle AI Database 26ai,23.26.2版本新引入的WITH子句嵌套进行了完整介绍与实战演示。
老规矩,知道写了些啥。
本文参与腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2026-07-06,如有侵权请联系[email protected] 删除相关文章
- 好用的英文翻译软件推荐 资源全面的翻译软件有哪些 07-08
- 顾芒陆承洲免费阅读软件有哪些 正版资源全面的阅读软件推荐 07-08
- 简单的文员办公软件自学教程有哪些:易上手的文员办公软件推荐 07-08
- 值得推荐的好生活app下载安装 类似好生活app集合 07-08
- 《息风谷战略》龙湾门副本流程做法介绍 07-08
- 实用的pdf免费编辑软件汇总 易上手的pdf免费编辑软件精选 07-08