

Oracle AI Database 23.26.2 解除了此前对 WITH 子句嵌套的限制,现在支持在其他 WITH 子句内部嵌套 WITH 子句,并允许在 WITH 子句有效的任何位置使用。
此前的限制:
新特性允许:
仍然不支持的:
关于内联提示:现有提示(inline/materialize)仍可使用,但在嵌套场景下可能被忽略,不影响非嵌套查询块的行为。
同之前一样,使用用户NFTEST,已授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。
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;

在一个WITH子句中嵌套的WITH子句
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;

3层:
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;

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;

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;

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