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

原文地址

使用 ORDER BY 控制树的深度优先与广度优先搜索

在递归选择的 ORDER BY 子句可用于控制对树的搜索是深度优先还是广度优先。为了说明这一点,我们将使用前面示例中 "org" 表的一个变体,其中不包含 "height" 列,并插入一些实际数据:

sql 复制代码
CREATE TABLE org(
  name TEXT PRIMARY KEY,
  boss TEXT REFERENCES org
) WITHOUT ROWID;
INSERT INTO org VALUES('Alice',NULL);
INSERT INTO org VALUES('Bob','Alice');
INSERT INTO org VALUES('Cindy','Alice');
INSERT INTO org VALUES('Dave','Bob');
INSERT INTO org VALUES('Emma','Bob');
INSERT INTO org VALUES('Fred','Cindy');
INSERT INTO org VALUES('Gail','Cindy');

以下是一个以广度优先模式展示树结构的查询:

sql 复制代码
WITH RECURSIVE
  under_alice(name,level) AS (
    VALUES('Alice',0)
    UNION ALL
    SELECT org.name, under_alice.level+1
      FROM org JOIN under_alice ON org.boss=under_alice.name
     ORDER BY 2
  )
SELECT substr('..........',1,level*3) || name FROM under_alice;

"ORDER BY 2"(与 "ORDER BY under_alice.level+1" 含义相同)会使组织结构图中较高的层级(具有较小的 "level" 值)被优先处理,从而实现广度优先搜索。输出结果如下:

复制代码
Alice
...Bob
...Cindy
......Dave
......Emma
......Fred
......Gail

但是,如果我们在 ORDER BY 子句中添加 "DESC" 修饰符,这将使组织结构中较低的层级(具有较大的 "level" 值)在递归选择中被优先处理,从而实现深度优先搜索:

sql 复制代码
WITH RECURSIVE
  under_alice(name,level) AS (
    VALUES('Alice',0)
    UNION ALL
    SELECT org.name, under_alice.level+1
      FROM org JOIN under_alice ON org.boss=under_alice.name
     ORDER BY 2 DESC
  )
SELECT substr('..........',1,level*3) || name FROM under_alice;

修改后的查询输出为:

复制代码
Alice
...Bob
......Dave
......Emma
...Cindy
......Fred
......Gail

注意 :当递归选择中省略 ORDER BY 子句时,队列的行为类似于 FIFO(先进先出),从而实现广度优先搜索。

相关推荐
wespaul6 小时前
VeapAI 自然语言操作实战|第 05 篇:向量与召回——从知识条目到可检索资产
大数据·数据库·人工智能·milvus
一只鹿鹿鹿11 小时前
政务外网整体设计方案(PPT)
大数据·数据库·web安全·系统安全·流程图·政务
2603_9651481111 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
AI砖家11 小时前
安全进入 Agent Loop:2027 年 Coding Agent 的决胜点
数据库·安全·codex·vibecoding
wangqiaowq11 小时前
SQL server C盘空间占满的处理
数据库·sql
文人sec12 小时前
SQL基础入门笔记 | 从零基础到掌握核心查询语句
数据库·笔记·sql
数字新视界12 小时前
机房动环监控提升运维效率
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
SelectDB技术团队12 小时前
冷热分层从建到验:Storage Policy 创建、表级与分区级绑定、SHOW TABLETS 验证的完整命令
大数据·数据库·elasticsearch·搜索引擎·数据分析·apache doris·冷热分层
YangYang9YangYan14 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
lambo mercy14 小时前
Day3:结构化输出
java·数据库·oracle