赞
踩
- https://www.postgresql.org/docs/10/queries-with.html
- https://www.postgresql.org/docs/10/sql-select.html
WITH提供了一种编写辅助语句以便在更大的查询中使用的方法。这些语句(通常称为公用表表达式或CTE)可以被视为定义仅针对一个查询存在的临时表。一个在每个辅助语句WITH子句可以是SELECT,INSERT,UPDATE,或DELETE; 和WITH本身所在的主语句也可以是SELECT,INSERT,UPDATE,或DELETE
WITH invoice_by_type AS ( SELECT cl_invoice_type, COUNT ( 1 ) COUNT FROM inv_t_invoice GROUP BY cl_invoice_type ),
invoice_max_type AS ( SELECT cl_invoice_type FROM invoice_by_type ORDER BY COUNT DESC LIMIT 2 )
SELECT
i.cl_id,i.cl_invoice_type,T.count
FROM
inv_t_invoice i
LEFT JOIN invoice_by_type T ON i.cl_invoice_type = T.cl_invoice_type
WHERE
i.cl_invoice_type IN (
SELECT
cl_invoice_type
FROM
invoice_max_type)
递归语法
非递归语句 UNION [ ALL | DISTINCT ] 递归语句
例如
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;
递归计算执行过程
需要注意防止递归出现无限循环,可以在主语句加入limit防止死循环
删除products数据并移到products_log
WITH moved_rows AS(
DELETE FROM products
WHERE
“date”> ='2010-10-01'and
“date”<'2010-11-01'RETURNING
*
)
INSERT INTO products_log
SELECT * FROM moved_rows;
WITH t AS(
DELETE FROM foo
)
DELETE FROM bar;
如果主句没有使用WITH子句,主句和子句的执行顺序无法确定
WITH t AS (
UPDATE products SET price = price * 1.05
RETURNING *
)
SELECT * FROM products;
可通过RETURNING *强制在主句中使用WITH子句,实现先执行用WITH子句,再执行主句
WITH t AS (
UPDATE products SET price = price * 1.05
RETURNING *
)
SELECT * FROM t;
https://www.postgresql.org/docs/10/sql-cluster.html
将当前表转为索引聚类表,索引聚类表将数据和索引存储在一起,可以加快通过索引访问数据的速度
使用指定索引聚类表
CLUSTER [VERBOSE] table_name [ USING index_name ]
聚类所有表
CLUSTER [VERBOSE]
索引聚类表不能在事物中执行
可以通过命令重建索引聚类表,保障所有行按索引顺序
https://www.postgresql.org/docs/10/tutorial-window.html
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; #Result depname | empno | salary | avg -----------+-------+--------+----------------------- develop | 11 | 5200 | 5020.0000000000000000 develop | 7 | 4200 | 5020.0000000000000000 develop | 9 | 4500 | 5020.0000000000000000 develop | 8 | 6000 | 5020.0000000000000000 develop | 10 | 5200 | 5020.0000000000000000 personnel | 5 | 3500 | 3700.0000000000000000 personnel | 2 | 3900 | 3700.0000000000000000 sales | 3 | 4800 | 4866.6666666666666667 sales | 1 | 5000 | 4866.6666666666666667 sales | 4 | 4800 | 4866.6666666666666667 (10 rows)
SELECT depname, empno, salary,
rank() OVER (PARTITION BY depname ORDER BY salary DESC)
FROM empsalary;
并行查询允许一个SQL同时使用多个CPU加快查询速度,主要用于OLAP场景
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。