溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

postgresql能不能進行遞歸查詢

發(fā)布時間:2020-08-01 10:45:50 來源:億速云 閱讀:149 作者:清晨 欄目:編程語言

小編給大家分享一下postgresql能不能進行遞歸查詢,相信大部分人都還不怎么了解,因此分享這邊文章給大家學習,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學習方法吧!

PostgreSQL提供了WITH語句,允許你構造用于查詢的輔助語句。這些語句通常稱為公共表表達式或cte。cte類似于只在查詢執(zhí)行期間存在的臨時表。

遞歸查詢是指遞歸CTE的查詢。遞歸查詢在很多情況下都很有用,比如查詢組織結構、物料清單等層次數(shù)據(jù)。

下面演示了遞歸CTE的語法:

WITH RECURSIVE cte_name(
    CTE_query_definition -- non-recursive term
    UNION [ALL]
    CTE_query definion  -- recursive term
) SELECT * FROM cte_name;

遞歸CTE有三個元素:

1.非遞歸項:非遞歸項是CTE查詢定義,它構成CTE結構的基本結果集。

2.遞歸項:遞歸項是使用UNION或UNION ALL操作符將一個或多個CTE查詢定義與非遞歸項連接起來。遞歸項引用CTE名稱本身。

3.終止檢查:當上一個迭代沒有返回任何行時,遞歸將停止。

PostgreSQL按以下順序執(zhí)行遞歸CTE:

1.執(zhí)行非遞歸項來創(chuàng)建基本結果集(R0)。

2.以Ri作為輸入執(zhí)行遞歸項,返回結果集Ri+1作為輸出。

3.重復步驟2,直到返回一個空集。(終止檢查)

4.返回最終的結果集,它是一個并集,或者是所有結果集R0、R1、……Rn的并集。

我們將創(chuàng)建一個新表來演示PostgreSQL遞歸查詢。

CREATE TABLE employees (
   employee_id serial PRIMARY KEY,
   full_name VARCHAR NOT NULL,
   manager_id INT
);

員工表由三個列組成:employee_id、manager_id和全名。manager_id列指定employee的manager id。

下面的語句將示例數(shù)據(jù)插入employees表。

INSERT INTO employees (
   employee_id,
   full_name,
   manager_id
)
VALUES
   (1, 'Michael North', NULL),
   (2, 'Megan Berry', 1),
   (3, 'Sarah Berry', 1),
   (4, 'Zoe Black', 1),
   (5, 'Tim James', 1),
   (6, 'Bella Tucker', 2),
   (7, 'Ryan Metcalfe', 2),
   (8, 'Max Mills', 2),
   (9, 'Benjamin Glover', 2),
   (10, 'Carolyn Henderson', 3),
   (11, 'Nicola Kelly', 3),
   (12, 'Alexandra Climo', 3),
   (13, 'Dominic King', 3),
   (14, 'Leonard Gray', 4),
   (15, 'Eric Rampling', 4),
   (16, 'Piers Paige', 7),
   (17, 'Ryan Henderson', 7),
   (18, 'Frank Tucker', 8),
   (19, 'Nathan Ferguson', 8),
   (20, 'Kevin Rampling', 8);

下面的查詢返回id為2的經(jīng)理的所有下屬。

WITH RECURSIVE subordinates AS (
   SELECT
      employee_id,
      manager_id,
      full_name
   FROM
      employees
   WHERE
      employee_id = 2
   UNION
      SELECT
         e.employee_id,
         e.manager_id,
         e.full_name
      FROM
         employees e
      INNER JOIN subordinates s ON s.employee_id = e.manager_id
) SELECT
   *
FROM
   subordinates;

上面sql的工作原理:

1.遞歸CTE subordinates定義了一個非遞歸項和一個遞歸項。

2.非遞歸項返回基本結果集R0,即id為2的員工。

employee_id | manager_id | full_name
------------+------------+-------------
       2 |       1 | Megan Berry

 遞歸項返回員工id 2的直接下屬。這是employee表和subordinates CTE之間連接的結果。遞歸項的第一次迭代返回以下結果集:

employee_id | manager_id | full_name
------------+------------+-----------------
       6 |       2 | Bella Tucker
       7 |       2 | Ryan Metcalfe
       8 |       2 | Max Mills
       9 |       2 | Benjamin Glover

 PostgreSQL重復執(zhí)行遞歸項。遞歸成員的第二次迭代使用上述步驟的結果集作為輸入值,返回該結果集:

employee_id | manager_id | full_name
------------+------------+-----------------
      16 |       7 | Piers Paige
      17 |       7 | Ryan Henderson
      18 |       8 | Frank Tucker
      19 |       8 | Nathan Ferguson
      20 |       8 | Kevin Rampling

第三次迭代返回一個空的結果集,因為沒有員工向id為16、17、18、19和20的員工。

PostgreSQL返回最終結果集,該結果集是由非遞歸和遞歸項生成的第一次和第二次迭代中的所有結果集的并集。

employee_id | manager_id | full_name
------------+------------+-----------------
      2 |       1 | Megan Berry
       6 |       2 | Bella Tucker
       7 |       2 | Ryan Metcalfe
       8 |       2 | Max Mills
          9 |       2 | Benjamin Glover
      16 |       7 | Piers Paige
      17 |       7 | Ryan Henderson
      18 |       8 | Frank Tucker
      19 |       8 | Nathan Ferguson
      20 |       8 | Kevin Rampling
(10 rows)

以上是postgresql能不能進行遞歸查詢的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI