ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

postgresql中sql高级特性

2021-10-14 21:35:19  阅读:189  来源: 互联网

标签:postgresql postgres area 特性 sql test id select name


--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,postgres,area,特性,sql,test,id,select,name
来源: https://www.cnblogs.com/LuoYao666/p/15408521.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有