PostgreSQL 递归视图

在本教程中,您将学习如何使用 CREATE RECURSIVE VIEW 语句创建 PostgreSQL 递归视图。

摘要:在本教程中,您将学习如何使用 CREATE RECURSIVE VIEW 语句创建 PostgreSQL 递归视图。

PostgreSQL 递归视图介绍

PostgreSQL 9.3 添加了用于创建标准 SQL 中指定的递归视图的新语法。该 CREATE RECURSIVE VIEW 语句是标准递归查询的语法糖。

下面说明了 CREATE RECURSIVE VIEW 语法:

CREATE RECURSIVE VIEW view_name(columns) AS
SELECT columns;

首先,在 CREATE RECURSIVE VIEW 子句中指定要创建的视图的名称。您可以向视图名称添加可选的模式限定。

其次,添加SELECT 语句以从基表查询数据。该 SELECT 语句引用 view_name 使视图递归。

上面的这个语句等价于下面的语句:

CREATE VIEW view_name 
AS
  WITH RECURSIVE cte_name (columns) AS (
    SELECT ...)
  SELECT columns FROM cte_name;

创建递归视图示例

我们将使用 employees 在递归查询教程中创建的表进行演示。

以下递归查询使用公共表表达式或 CTE 将员工及其经理返回到 CEO 级别。

WITH RECURSIVE reporting_line AS (
    SELECT
        employee_id,
        full_name AS subordinates
    FROM
        employees
    WHERE
        manager_id IS NULL
    UNION ALL
        SELECT
            e.employee_id,
            (
                rl.subordinates || ' > ' || e.full_name
            ) AS subordinates
        FROM
            employees e
        INNER JOIN reporting_line rl ON e.manager_id = rl.employee_id
) SELECT
    employee_id,
    subordinates
FROM
    reporting_line
ORDER BY
    employee_id;
employee_id |                         subordinates
-------------+--------------------------------------------------------------
           1 | Michael North
           2 | Michael North > Megan Berry
           3 | Michael North > Sarah Berry
           4 | Michael North > Zoe Black
           5 | Michael North > Tim James
           6 | Michael North > Megan Berry > Bella Tucker
           7 | Michael North > Megan Berry > Ryan Metcalfe
           8 | Michael North > Megan Berry > Max Mills
           9 | Michael North > Megan Berry > Benjamin Glover
          10 | Michael North > Sarah Berry > Carolyn Henderson
          11 | Michael North > Sarah Berry > Nicola Kelly
          12 | Michael North > Sarah Berry > Alexandra Climo
          13 | Michael North > Sarah Berry > Dominic King
          14 | Michael North > Zoe Black > Leonard Gray
          15 | Michael North > Zoe Black > Eric Rampling
          16 | Michael North > Megan Berry > Ryan Metcalfe > Piers Paige
          17 | Michael North > Megan Berry > Ryan Metcalfe > Ryan Henderson
          18 | Michael North > Megan Berry > Max Mills > Frank Tucker
          19 | Michael North > Megan Berry > Max Mills > Nathan Ferguson
          20 | Michael North > Megan Berry > Max Mills > Kevin Rampling
(20 rows)

您可以使用该 CREATE RECURSIVE VIEW 语句将查询转换为递归视图,如下所示:

CREATE RECURSIVE VIEW reporting_line (employee_id, subordinates) AS 
SELECT
    employee_id,
    full_name AS subordinates
FROM
    employees
WHERE
    manager_id IS NULL
UNION ALL
    SELECT
        e.employee_id,
        (
            rl.subordinates || ' > ' || e.full_name
        ) AS subordinates
    FROM
        employees e
    INNER JOIN reporting_line rl ON e.manager_id = rl.employee_id;

要查看员工 ID 10 的报告行,您可以直接从视图中查询:

SELECT
    subordinates
FROM
    reporting_line
WHERE
    employee_id = 10;
subordinates
-------------------------------------------------
 Michael North > Sarah Berry > Carolyn Henderson
(1 row)

在本教程中,您学习了如何基于递归查询创建 PostgreSQL 递归视图。