简单 CTE
WITH cte_name (col1, col2, ...) AS (
cte_query_definition
)
sql_statement;
WITH department_avg(department_id, avg_salary) AS (
SELECT department_id,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT d.department_name,
da.avg_salary
FROM departments d
JOIN department_avg da
ON (d.department_id = da.department_id)
ORDER BY d.department_name;
department_name |avg_salary |
----------------|----------------------|
Accounting |10154.0000000000000000|
Administration | 4400.0000000000000000|
Executive | 19333.333333333333|
...
WITH cte1(n) AS (
SELECT 1
),
cte2(m) as (
select n+1 from cte1
)
SELECT *
FROM cte1, cte2;
n|m|
-|-|
1|2|
递归 CTE
WITH RECURSIVE cte_name AS(
cte_query_initial -- 初始化部分
UNION [ALL]
cte_query_iterative -- 递归部分
) SELECT * FROM cte_name;
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 10
)
SELECT n FROM t;
n |
--|
1|
2|
3|
4|
5|
6|
7|
8|
9|
10|
WITH RECURSIVE employee_path (employee_id, employee_name, path) AS
(
SELECT employee_id, CONCAT(first_name, ',', last_name), CONCAT(first_name, ',', last_name) AS path
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, CONCAT(e.first_name, ',', e.last_name), CONCAT(ep.path, '->', e.first_name, ',', e.last_name)
FROM employee_path ep
JOIN employees e ON ep.employee_id = e.manager_id
)
SELECT * FROM employee_path ORDER BY employee_id;
employee_id|employee_name |path |
-----------|-----------------|--------------------------------------------------------------|
100|Steven,King |Steven,King |
101|Neena,Kochhar |Steven,King->Neena,Kochhar |
102|Lex,De Haan |Steven,King->Lex,De Haan |
103|Alexander,Hunold |Steven,King->Lex,De Haan->Alexander, |
104|Bruce,Ernst |Steven,King->Lex,De Haan->Alexander,Hunold->Bruce,Ernst |
105|David,Austin |Steven,King->Lex,De Haan->Alexander,Hunold->David,Austin |
106|Valli,Pataballa |Steven,King->Lex,De Haan->Alexander,Hunold->Valli,Pataballa |
...
DML 语句与 CTE
-- 创建一个员工历史表
CREATE TABLE employees_history
AS SELECT * FROM employees WHERE 1 = 0;
with deletes as (
delete from employees
where employee_id = 206
returning *
)
insert into employees_history
select * from deletes;
select employee_id, first_name, last_name
from employees_history;
employee_id|first_name|last_name|
-----------|----------|---------|
206|William |Gietz |
with inserts as (
insert into employees
values (206,'William','Gietz','WGIETZ','515.123.8181','2002-06-07','AC_ACCOUNT',8800.00,NULL,205,110)
returning *
)
insert into employees_history
select * from inserts;
delete from employees_history;-- 清除历史记录
with updates as (
update employees
set salary = salary + 500
where employee_id = 206
returning *
)
insert into employees_history
select * from employees where employee_id = 206;
select employee_id, salary from employees_history;
employee_id|salary |
-----------|-------|
206|8300.00|
with updates as (
update employees
set salary = salary - 500
where employee_id = 206
returning *
)
select employee_id,first_name, last_name, salary
from updates;
employee_id|first_name|last_name|salary |
-----------|----------|---------|-------|
206|William |Gietz |8300.00|
文章转载自SQL编程思想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




