小编给大家分享一下postgresql能不能进行递归查询,相信大部分人都还不怎么了解,因此分享这边文章给大家学习,希望大家阅读完这篇文章后大所收获,下面让我们一起去学习方法吧!

PostgreSQL提供了WITH语句,允许你构造用于查询的辅助语句。这些语句通常称为公共表表达式或cte。cte类似于只在查询执行期间存在的临时表。

递归查询是指递归CTE的查询。递归查询在很多情况下都很有用,比如查询组织结构、物料清单等层次数据。

下面演示了递归CTE的语法:

WITHRECURSIVEcte_name(CTE_query_definition--non-recursivetermUNION[ALL]CTE_querydefinion--recursiveterm)SELECT*FROMcte_name;

递归CTE有三个元素:

1.非递归项:非递归项是CTE查询定义,它构成CTE结构的基本结果集。

2.递归项:递归项是使用UNION或UNION ALL操作符将一个或多个CTE查询定义与非递归项连接起来。递归项引用CTE名称本身。

3.终止检查:当上一个迭代没有返回任何行时,递归将停止。

PostgreSQL按以下顺序执行递归CTE:

1.执行非递归项来创建基本结果集(R0)。

2.以Ri作为输入执行递归项,返回结果集Ri+1作为输出。

3.重复步骤2,直到返回一个空集。(终止检查)

4.返回最终的结果集,它是一个并集,或者是所有结果集R0、R1、……Rn的并集。

我们将创建一个新表来演示PostgreSQL递归查询。

CREATETABLEemployees(employee_idserialPRIMARYKEY,full_nameVARCHARNOTNULL,manager_idINT);

员工表由三个列组成:employee_id、manager_id和全名。manager_id列指定employee的manager id。

下面的语句将示例数据插入employees表。

INSERTINTOemployees(employee_id,full_name,manager_id)VALUES(1,'MichaelNorth',NULL),(2,'MeganBerry',1),(3,'SarahBerry',1),(4,'ZoeBlack',1),(5,'TimJames',1),(6,'BellaTucker',2),(7,'RyanMetcalfe',2),(8,'MaxMills',2),(9,'BenjaminGlover',2),(10,'CarolynHenderson',3),(11,'NicolaKelly',3),(12,'AlexandraClimo',3),(13,'DominicKing',3),(14,'LeonardGray',4),(15,'EricRampling',4),(16,'PiersPaige',7),(17,'RyanHenderson',7),(18,'FrankTucker',8),(19,'NathanFerguson',8),(20,'KevinRampling',8);

下面的查询返回id为2的经理的所有下属。

WITHRECURSIVEsubordinatesAS(SELECTemployee_id,manager_id,full_nameFROMemployeesWHEREemployee_id=2UNIONSELECTe.employee_id,e.manager_id,e.full_nameFROMemployeeseINNERJOINsubordinatessONs.employee_id=e.manager_id)SELECT*FROMsubordinates;

上面sql的工作原理:

1.递归CTE subordinates定义了一个非递归项和一个递归项。

2.非递归项返回基本结果集R0,即id为2的员工。

employee_id|manager_id|full_name------------+------------+-------------2|1|MeganBerry

递归项返回员工id 2的直接下属。这是employee表和subordinates CTE之间连接的结果。递归项的第一次迭代返回以下结果集:

employee_id|manager_id|full_name------------+------------+-----------------6|2|BellaTucker7|2|RyanMetcalfe8|2|MaxMills9|2|BenjaminGlover

PostgreSQL重复执行递归项。递归成员的第二次迭代使用上述步骤的结果集作为输入值,返回该结果集:

employee_id|manager_id|full_name------------+------------+-----------------16|7|PiersPaige17|7|RyanHenderson18|8|FrankTucker19|8|NathanFerguson20|8|KevinRampling

第三次迭代返回一个空的结果集,因为没有员工向id为16、17、18、19和20的员工。

PostgreSQL返回最终结果集,该结果集是由非递归和递归项生成的第一次和第二次迭代中的所有结果集的并集。

employee_id|manager_id|full_name------------+------------+-----------------2|1|MeganBerry6|2|BellaTucker7|2|RyanMetcalfe8|2|MaxMills9|2|BenjaminGlover16|7|PiersPaige17|7|RyanHenderson18|8|FrankTucker19|8|NathanFerguson20|8|KevinRampling(10rows)

以上是postgresql能不能进行递归查询的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!