PostgreSQL – CTE
在 PostgreSQL 中,CTE(通用表表达式)用作临时结果集,用户可以在另一个 SQL 语句(如 SELECT、INSERT、UPDATE 或 DELETE)中引用该结果集。 CTE 是临时的,因为它们仅在查询执行期间存在。 CTE 通常用于简化 PostgreSQL 中复杂的连接和子查询。
Syntax:
WITH cte_name (column_list) AS (
CTE_query_definition
)
statement;
我们来分析一下上面的语法。
- 第一步是设置 CTE 的名称,然后是可选的列列表。
- 然后我们指定一个查询,该查询返回 WITH 子句主体内的结果集。如果未明确指定,则 CTE_query_definition 的选择列表将成为 CTE 的列列表。
- 最后在语句中像表或视图一样使用 CTE,它可以是 SELECT、INSERT、UPDATE 或 DELETE。
例如,我们将使用示例数据库(即 dvdrental)。
示例 1:
在此,我们将使用 WITH 子句和电影和租赁表定义一个名为cte_film
的公用表表达式,以确定电影的长度。
WITH cte_film AS (
SELECT
film_id,
title,
(CASE
WHEN length < 30 THEN 'Short'
WHEN length < 90 THEN 'Medium'
ELSE 'Long'
END) length
FROM
film
)
SELECT
film_id,
title,
length
FROM
cte_film
WHERE
length = 'Long'
ORDER BY
title;
输出:
示例 2:
以下语句说明了使用 CTE 和film
表中的RANK()
窗口函数来根据film
的长度对film
进行排名,如下所示:
WITH cte_film AS (
SELECT film_id,
title,
rating,
length,
RANK() OVER (
PARTITION BY rating
ORDER BY length DESC)
length_rank
FROM
film
)
SELECT *
FROM cte_film
WHERE length_rank = 1;
输出: