📜  PostgreSQL – CTE

📅  最后修改于: 2022-05-13 01:57:15.638000             🧑  作者: Mango

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;

输出: