PostgreSQL教程

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)

 

这篇关于postgresql中sql高级特性的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!