postgresql能不能進(jìn)行遞歸查詢

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

站在用戶的角度思考問題,與客戶深入溝通,找到開平網(wǎng)站設(shè)計(jì)與開平網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋開平地區(qū)。

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

遞歸查詢是指遞歸CTE的查詢。遞歸查詢?cè)诤芏嗲闆r下都很有用,比如查詢組織結(jié)構(gòu)、物料清單等層次數(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有三個(gè)元素:

1.非遞歸項(xiàng):非遞歸項(xiàng)是CTE查詢定義,它構(gòu)成CTE結(jié)構(gòu)的基本結(jié)果集。

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

3.終止檢查:當(dāng)上一個(gè)迭代沒有返回任何行時(shí),遞歸將停止。

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

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

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

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

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

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

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

員工表由三個(gè)列組成: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定義了一個(gè)非遞歸項(xiàng)和一個(gè)遞歸項(xiàng)。

2.非遞歸項(xiàng)返回基本結(jié)果集R0,即id為2的員工。

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

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

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

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

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

第三次迭代返回一個(gè)空的結(jié)果集,因?yàn)闆]有員工向id為16、17、18、19和20的員工。

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

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能不能進(jìn)行遞歸查詢的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文標(biāo)題:postgresql能不能進(jìn)行遞歸查詢
鏈接分享:http://muchs.cn/article14/ihidge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、全網(wǎng)營銷推廣、手機(jī)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)