news 2026/7/14 12:42:53

postgresql递归查询指定搜索顺序的方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
postgresql递归查询指定搜索顺序的方法

原文地址

搜索顺序

在使用递归查询进行树遍历计算时,你可能希望按照深度优先或广度优先的顺序对结果进行排序。这可以通过在数据列之外再计算一个排序列来实现,并在最后使用该列对结果进行排序。需要注意的是,这实际上并不会控制查询评估访问行的顺序;这个顺序在 SQL 中始终依赖于具体实现。此方法仅提供了一种在事后对结果进行排序的便捷方式。

创建深度优先顺序

我们可以为每个结果行计算一个数组,用于记录截至目前已访问过的行。例如,考虑以下使用link字段搜索表tree的查询:

WITHRECURSIVE search_tree(id,link,data)AS(SELECTt.id,t.link,t.dataFROMtree tUNIONALLSELECTt.id,t.link,t.dataFROMtree t,search_tree stWHEREt.id=st.link)SELECT*FROMsearch_tree;

要添加深度优先排序信息,可以这样写:

WITHRECURSIVE search_tree(id,link,data,path)AS(SELECTt.id,t.link,t.data,ARRAY[t.id]FROMtree tUNIONALLSELECTt.id,t.link,t.data,path||t.idFROMtree t,search_tree stWHEREt.id=st.link)SELECT*FROMsearch_treeORDERBYpath;

在一般情况下,如果需要使用多个字段来标识一行,可以使用行数组。例如,如果需要追踪字段f1f2

WITHRECURSIVE search_tree(id,link,data,path)AS(SELECTt.id,t.link,t.data,ARRAY[ROW(t.f1,t.f2)]FROMtree tUNIONALLSELECTt.id,t.link,t.data,path||ROW(t.f1,t.f2)FROMtree t,search_tree stWHEREt.id=st.link)SELECT*FROMsearch_treeORDERBYpath;

提示:在常见的只需追踪一个字段的情况下,可以省略ROW()语法。这样可以使用简单数组而非复合类型数组,从而提高效率。

创建广度优先顺序

你可以添加一个列来追踪搜索的深度,例如:

WITHRECURSIVE search_tree(id,link,data,depth)AS(SELECTt.id,t.link,t.data,0FROMtree tUNIONALLSELECTt.id,t.link,t.data,depth+1FROMtree t,search_tree stWHEREt.id=st.link)SELECT*FROMsearch_treeORDERBYdepth;

为了获得稳定的排序,可以将数据列作为次要排序列添加。

提示:递归查询评估算法会以广度优先搜索的顺序产生输出。然而,这是一个实现细节,依赖它可能并不可靠。每一层内的行顺序肯定是未定义的,因此在任何情况下,可能都需要一些显式的排序。

内置语法

PostgreSQL 提供了内置语法来计算深度优先或广度优先的排序列。例如:

WITHRECURSIVE search_tree(id,link,data)AS(SELECTt.id,t.link,t.dataFROMtree tUNIONALLSELECTt.id,t.link,t.dataFROMtree t,search_tree stWHEREt.id=st.link)SEARCH DEPTHFIRSTBYidSETordercolSELECT*FROMsearch_treeORDERBYordercol;
WITHRECURSIVE search_tree(id,link,data)AS(SELECTt.id,t.link,t.dataFROMtree tUNIONALLSELECTt.id,t.link,t.dataFROMtree t,search_tree stWHEREt.id=st.link)SEARCH BREADTHFIRSTBYidSETordercolSELECT*FROMsearch_treeORDERBYordercol;

该语法在内部会被扩展为类似于上述手写形式的内容。SEARCH子句指定了是需要深度优先还是广度优先搜索、用于排序的列列表,以及一个将包含可用于排序的结果数据的列名。该列将隐式添加到 CTE 的输出行中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 4:50:02

学长亲荐10个AI论文软件,自考毕业论文轻松搞定!

学长亲荐10个AI论文软件,自考毕业论文轻松搞定! AI工具如何助你轻松应对论文挑战 在自考学习过程中,毕业论文往往是最让人头疼的一环。从选题到撰写,再到反复修改,每一步都需要投入大量时间和精力。而随着AI技术的不断…

作者头像 李华
网站建设 2026/7/7 10:36:49

中高轨激光通信卫星伺服控制器抗辐照电源模块设计

摘要:随着中高轨道激光通信卫星技术的快速发展,伺服控制器作为激光链路建立与维持的核心执行单元,其电源模块的抗辐照特性成为保障星载设备长期可靠运行的关键要素。本文系统梳理了中高轨空间辐射环境特征及其对电源系统的损伤机理&#xff0…

作者头像 李华
网站建设 2026/7/8 10:05:41

Thiol-PEG₄-methyl,巯基聚乙二醇四单元甲基化,生物应用

Thiol-PEG₄-methyl,巯基聚乙二醇四单元甲基化,生物应用 中文名称:巯基聚乙二醇四单元甲基化(Thiol-PEG₄-methyl) Thiol-PEG₄-methyl 是一种功能化短链聚乙二醇(PEG)衍生物,其分…

作者头像 李华
网站建设 2026/7/8 10:05:41

中科院让AI大模型学会“分层思考“,底层神经元也能独当一面了

说起人工智能,我们通常把它当作一个整体来看待——输入问题,输出答案,就像一个黑盒子一样神秘。但中科院自动化研究所的研究团队却有了一个颠覆性的发现:原来AI大模型内部其实暗藏着许多"小助手",每一层神经…

作者头像 李华
网站建设 2026/7/1 14:31:28

网络安全的“地基”怎么打?一文搞懂七大关键安全模型与框架

一、网络安全框架及模型是什么? 网络安全专业机构制定的一套标准、准则和程序,旨在帮助组织了解和管理面临的网络安全风险。优秀的安全框架及模型应该为用户提供一种可靠方法,帮助其实现网络安全建设计划。对于那些希望按照行业最佳实践来设…

作者头像 李华