在 Oracle 中,WITH
子句(也称为 公共表表达式,Common Table Expression,CTE)用于定义一个临时的命名子查询,可以在后续的 SQL 语句中多次引用。它提高了复杂查询的可读性和可维护性,尤其适合需要多次使用同一子查询或递归查询的场景。
基础语法
WITH
cte_name (column1, column2, ...) AS (
SELECT ... -- 定义临时结果集
)
SELECT ... -- 主查询(可引用CTE)
常见用途
1. 简化复杂子查询
WITH sales_summary AS (
SELECT
product_id,
SUM(amount) AS total_sales
FROM sales
GROUP BY product_id
)
SELECT
p.product_name,
s.total_sales
FROM products p
JOIN sales_summary s ON p.product_id = s.product_id;
2. 递归查询(树形结构或层次数据)
WITH employee_hierarchy (employee_id, name, manager_id, level) AS (
-- 初始查询(根节点)
SELECT
employee_id,
name,
manager_id,
1 AS level
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- 递归部分
SELECT
e.employee_id,
e.manager_id,
eh.level + 1
FROM employees e
JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM employee_hierarchy;
3. 组合多个CTE
WITH
cte1 AS (SELECT ... FROM table1),
cte2 AS (SELECT ... FROM table2)
SELECT
cte1.col1,
cte2.col2
FROM cte1
通过 WITH
子句,可以显著提升复杂查询的结构化程度,尤其在处理多层次逻辑或递归数据时非常高效。