1. 程式人生 > 其它 >postgresql中sql高階特性

postgresql中sql高階特性

--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)