当前位置:   article > 正文

postgresql中的with查询_postgrel with 临时查询

postgrel with 临时查询

       WITH提供了一种编写辅助语句的方法,以便在较大的查询中使用。这些语句通常被称为公共表表达式或CTE,可以认为它们定义了仅为一个查询而存在的临时表。WITH子句中的每个辅助语句可以是SELECT、INSERT、UPDATE或DELETE;WITH子句本身附加到主语句,主语句也可以是SELECT、INSERT、UPDATE或DELETE。

先通过一个简单的CTE示例了解WITH查询,如下所示:

  1. WITH t as
  2. (SELECT generate_series(1,3))
  3. SELECT * FROM t;

结果:

       这个简单的CTE示例中,一开始定义了一条辅助语句t取数,之后在主查询语句中查询t,定义的辅助语句就像是定义了一张临时表,对于复杂查询如果不使用CTE,可以通过创建视图方式简化SQL。

       可选的 RECURSIVE修饰符从单纯的语法便利变成了一个功能,可以完成标准SQL中不可能完成的任务。使用RECURSIVE,WITH查询可以引用它自己的输出。从而实现递归,一般用于层次结构或树状结构的应用场景。注:严格地说,这个过程是迭代而不是递归,但是递归是SQL标准委员会选择的术语。

例如,创建表准备数据:

  1. create table area(id int,name text,fatherid int);
  2. insert into area values(1, '中国', 0),(2, '北京', 1),(3, '上海', 1),(4, '昌平区', 2),(5, '黄浦区', 3);

使用PostgreSQL的WITH查询检索ID为 5 以及以上的所有父节点:

  1. WITH RECURSIVE r AS
  2. (SELECT *
  3. FROM area
  4. WHERE id = 5
  5. UNION ALL
  6. SELECT area.*
  7. FROM area,
  8. r WHERE area.id = r.fatherid )
  9. SELECT *
  10. FROM r
  11. ORDER BY id;

结果:

使用PostgreSQL的WITH查询检索ID为 4 以及以上的所有父节点:

  1. WITH RECURSIVE r AS
  2. (SELECT *
  3. FROM area
  4. WHERE id = 4
  5. UNION ALL
  6. SELECT area.*
  7. FROM area,
  8. r WHERE area.id = r.fatherid )
  9. SELECT *
  10. FROM r
  11. ORDER BY id;

结果:

       在处理递归查询时,务必确保查询的递归部分最终不会返回元组,否则查询将无限循环。有时候,使用UNION代替UNION ALL可以通过丢弃前面重复输出的行来实现这一点。然而,循环通常不涉及完全重复的输出行:可能需要只检查一个或几个字段,以查看以前是否达到了相同的点。处理这种情况的标准方法是计算已访问值的数组。递归查询求值算法以广度优先的搜索顺序产生输出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/493128
推荐阅读
相关标签
  

闽ICP备14008679号