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)

 

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...