微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐