CTE(Common Table Expressions)是指使用WITH語句定義的通用表表達式。
如:
testdb=# explain verbose WITH t1 AS ( SELECT * FROM t_w1 WHERE t_w1.id % 4 = 0 ) SELECT * FROM t1 JOIN t_w2 as t2 ON t2.id = t1.id;
QUERY PLAN
--------------------------------------------------------------------------
Hash Join (cost=167.74..359.00 rows=76 width=70)
Output: t1.id, t1.c1, t2.id, t2.c1
Hash Cond: (t2.id = t1.id)
CTE t1
-> Seq Scan on public.t_w1 (cost=0.00..166.50 rows=38 width=8)
Output: t_w1.id, t_w1.c1
Filter: ((t_w1.id % 4) = 0)
-> Seq Scan on public.t_w2 t2 (cost=0.00..153.00 rows=10000 width=8)
Output: t2.id, t2.c1
-> Hash (cost=0.76..0.76 rows=38 width=62)
Output: t1.id, t1.c1
-> CTE Scan on t1 (cost=0.00..0.76 rows=38 width=62)
Output: t1.id, t1.c1
(13 rows)
使用CTE可以:
1.增強SQL的可讀性:如上例所示,通過CTE,可以”模塊化”SQL語句,增強腳本可讀性
2.實現(xiàn)遞歸:通過增加RECURSIVE修飾符來引入它自己,從而實現(xiàn)遞歸
遞歸
遞歸通常用于處理邏輯上存在層次或樹狀結(jié)構(gòu)的數(shù)據(jù).
如:
drop table if exists t_cte;
create table t_cte(id varchar(10),parent_id varchar(10));
insert into t_cte values('1',NULL);
insert into t_cte values('11','1');
insert into t_cte values('12','1');
insert into t_cte values('111','11');
insert into t_cte values('112','11');
insert into t_cte values('121','12');
id為數(shù)據(jù)表的id,parent_id是該id的父id,通過該字段可找到對應(yīng)的父記錄,先要求打印這些數(shù)據(jù)的樹狀結(jié)構(gòu),相應(yīng)的SQL語句如下:
我們提供的服務(wù)有:網(wǎng)站制作、網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、海林ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的海林網(wǎng)站制作公司
WITH RECURSIVE ret AS
(
SELECT
parent_id,
id::text as name,
id::text
FROM t_cte
WHERE id = '1'
UNION ALL
SELECT
t.parent_id,
t.parent_id || ' > ' || t.id as name,
t.id
FROM ret
JOIN t_cte t
ON t.parent_id = ret.id
)
SELECT
parent_id,
name
FROM ret;
WITH RECURSIVE語句包含兩個部分
1.non-recursive term(非遞歸部分)
即上例中的:
SELECT
parent_id,
id::text as name,
id::text
FROM t_cte
WHERE id = '1'
2.recursive term(遞歸部分)
即上例中的:
SELECT
t.parent_id,
t.parent_id || ' > ' || t.id as name,
t.id
FROM ret
JOIN t_cte t
ON t.parent_id = ret.id
執(zhí)行步驟如下
1.執(zhí)行non-recursive term。其結(jié)果作為recursive term中對ret的引用,同時將這部分結(jié)果放入工作表中
2.重復(fù)執(zhí)行如下步驟,直到工作表為空:用工作表的內(nèi)容替換遞歸的自引用(上例中的ret),執(zhí)行recursive term,并用該結(jié)果替換工作表
大凡遞歸, 必須有結(jié)束條件,工作表為空則是CTE Recursive的結(jié)束條件.就上例來說,
SELECT
t.parent_id,
t.parent_id || ' > ' || t.id as name,
t.id
FROM ret
JOIN t_cte t
ON t.parent_id = ret.id
返回為空時,遞歸結(jié)束.
網(wǎng)站名稱:PostgreSQLDBA(35)-CTE
URL地址:http://chinadenli.net/article6/gehpig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、、品牌網(wǎng)站設(shè)計、域名注冊、用戶體驗、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)