2026/1/8 8:09:01
网站建设
项目流程
高端品牌网站建设是什么,电脑网站进不去网页怎么办,企业网站的建立,外贸公司查询原文地址
搜索顺序
在使用递归查询进行树遍历计算时#xff0c;你可能希望按照深度优先或广度优先的顺序对结果进行排序。这可以通过在数据列之外再计算一个排序列来实现#xff0c;并在最后使用该列对结果进行排序。需要注意的是#xff0c;这实际上并不会控制查询评估访…原文地址搜索顺序在使用递归查询进行树遍历计算时你可能希望按照深度优先或广度优先的顺序对结果进行排序。这可以通过在数据列之外再计算一个排序列来实现并在最后使用该列对结果进行排序。需要注意的是这实际上并不会控制查询评估访问行的顺序这个顺序在 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.idst.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.idst.link)SELECT*FROMsearch_treeORDERBYpath;在一般情况下如果需要使用多个字段来标识一行可以使用行数组。例如如果需要追踪字段f1和f2WITHRECURSIVE 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.idst.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,depth1FROMtree t,search_tree stWHEREt.idst.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.idst.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.idst.link)SEARCH BREADTHFIRSTBYidSETordercolSELECT*FROMsearch_treeORDERBYordercol;该语法在内部会被扩展为类似于上述手写形式的内容。SEARCH子句指定了是需要深度优先还是广度优先搜索、用于排序的列列表以及一个将包含可用于排序的结果数据的列名。该列将隐式添加到 CTE 的输出行中。