postgresql中sql高階特性
阿新 • • 發佈:2021-10-14
--with查詢
1.CTE(common table expression),在複雜查詢中定義一個輔助語句(可理解為在查詢中定義一個臨時表),常用於複雜查詢或遞迴查詢
postgres=# with t as (select generate_series(1,3)) select * from t; generate_series ----------------- 1 2 3 (3 rows)
如果有多個得使用with A as (),B as () select **** from ;
2.遞迴查詢使用CTE(union all是將兩個select語句的結果求並集。 union是將union all的結果下再去除重複資料
with查詢的一個重要屬性recursive,使用recursive引用自己的輸出從而實現遞迴,一般用於層次結構或樹狀結構
x從1開始,union+1後的值,迴圈直到5結束,之後計算X的總和
postgres=# with recursive t (x) as (select 1 union select x+1 from t where x<5) select sum(x) from t; sum ----- 15 (1 row)
層次數字遞迴應用場景
構造測試表資料
postgres=# select * from test_area order by id; id| name | fatherid ----+--------+---------- 1 | 中國 | 0 2 | 遼寧 | 1 3 | 山東 | 1 4 | 瀋陽 | 2 5 | 大連 | 2 6 | 濟南 | 3 7 | 和平區 | 4 8 | 瀋河區 | 4 (8 rows)
查詢檢索ID為7及以上父節點,將結果輸出name欄位合併為“中國遼寧瀋陽和平區”,這裡通過string_agg實現
postgres=# with recursive r as (select* from test_area where id=7 postgres(# union all postgres(# select test_area.* from test_area,r where test_area.id = r.fatherid) postgres-# select string_agg(name,'') from (select name from r order by id) n; string_agg -------------------- 中國遼寧瀋陽和平區 (1 row)
ostgres=# with recursive r as (select * from test_area where id=10 union all select test_area.* from test_area,r where test_area.id = r.fatherid) select string_agg(name,'') from (select name from r order by id) n; string_agg ---------------- 中國重慶永川區 (1 row) postgres=# select * from test_area order by fatherid; id | name | fatherid ----+--------+---------- 1 | 中國 | 0 9 | 重慶 | 1 3 | 山東 | 1 2 | 遼寧 | 1 4 | 瀋陽 | 2 5 | 大連 | 2 6 | 濟南 | 3 7 | 和平區 | 4 8 | 瀋河區 | 4 10 | 永川區 | 9 (10 rows)