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

相关推荐
En^_^Joy20 小时前
Django开发:模板系统入门指南
数据库·django·sqlite
无关868821 小时前
Redis Bitmaps 用户签到系统设计方案
数据库·redis·缓存
江华森21 小时前
FastAPI 极速开发指南 — 从零到生产级 API 实战
数据库·fastapi
老纪1 天前
Redis分布式锁进第九零篇
数据库·redis·分布式
haven-8521 天前
MySQL事务ACID、隔离级别、MVCC、幻读解决
数据库·mysql
小高学习java1 天前
事务的边界问题,如何判断数据回滚时机。
java·数据库·后端
迷枫7121 天前
【无标题】
数据库
TDengine (老段)1 天前
TDengine 扫描算子 — TableScan、TagScan 与下推优化
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
放下华子我只抽RuiKe51 天前
FastAPI 全栈后端(三):数据库与 ORM
前端·数据库·react.js·oracle·性能优化·前端框架·fastapi
BAGAE1 天前
星链卫星数据获取:从太空安全到实时通信的技术革命
网络·数据结构·数据库·算法·云计算·hbase