前言
在Oracle数据库中,WITH子句(也成为“子查询因子化” 或“公共表表达式”,Common Table Expression, CTE)用于定义一个临时命名的结果集,这个结果集可以在后续的查询中引用。
一、基本语法
WITH sjtab AS (SELECT column1, column2FROM some_tableWHERE condition
)
SELECT * FROM sjtab;
各部分含义说明:
- WITH:
关键字,表示开始一个CTE定义 - sjtab:
你为这个临时结果集指定的名称(可以任意命名) - AS:
关键字,连接名称和查询定义 - 括号内的查询:
定义临时结果集的实际查询
二、主要用途
1.提高可读性:
将复杂查询分解为更简单的部分
2.避免重复子查询:
可以多次引用同一个CTE而不需要重复编写
3.递归查询:
支持递归CTE,用于处理层次结构数据
示例:
WITH dept_costs AS (SELECT department_name, SUM(salary) dept_totalFROM employees e, departments dWHERE e.department_id = d.department_idGROUP BY department_name
)
SELECT * FROM dept_costs
WHERE dept_total > (SELECT AVG(dept_total) FROM dept_costs)
ORDER BY department_name;
在这个例子中,dept_costs是一个CTE,它计算了每个部门的总薪资,然后在主查询中被引用两次。