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)