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(先进先出),从而实现广度优先搜索。

相关推荐
l1t2 分钟前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
执子手 吹散苍茫茫烟波14 分钟前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql
落叶-IT1 小时前
Java异常处理深度实战教程:异常传播的失败场景分析
数据库·oracle
执子手 吹散苍茫茫烟波2 小时前
常见的数据库隔离级别以及企业里常用的是什么方案
数据库
Database_Cool_3 小时前
数据库慢查询优化首选方案:阿里云 RDS 性能洞察+自动诊断
数据库·人工智能·阿里云
YOU OU3 小时前
Redis初识
数据库·redis·缓存
长孙豪翔3 小时前
在.net中读写config文件的各种方法
java·数据库·.net
深盾科技_Virbox4 小时前
加密狗授权能力选型:从授权模型到全生命周期管理
java·网络·数据库
峥无4 小时前
深入理解MySQL事务与MVCC机制
数据库·mysql
行思理4 小时前
MongoDB 大数据备份,新手教程
数据库·mongodb