当前位置: 首页 > news >正文

在duckdb 递归CTE中实现深度优先搜索DFS

原帖地址 https://github.com/duckdb/duckdb/discussions/15386

通常的递归CTE都是广度优先搜索(BFS)

WITHRECURSIVE edges(a,b)as(VALUES(1,2),(1,3),(2,4),(4,5),(4,6)),bfs(node,path)AS(SELECT1ASnode,[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Start with node 1 (root)UNIONALLSELECTe.b,bft.path||[{'from': bft.node,'to': e.b}]FROMbfsASbft,edgesASeWHEREbft.node=e.a)SELECT*FROMbfs;┌───────┬────────────────────────────────────────────────────────────────────┐ │ node │ path │ │ int32 │ struct("from"integer,"to"integer)[]│ ├───────┼────────────────────────────────────────────────────────────────────┤ │1[]│ │2[{'from':1,'to':2}]│ │3[{'from':1,'to':3}]│ │4[{'from':1,'to':2},{'from':2,'to':4}]│ │5[{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':5}]│ │6[{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':6}]│ └───────┴────────────────────────────────────────────────────────────────────┘

DuckDB CTE模块的设计者kryonix提供了如下技巧提供DFS,但是还有问题,没有求出全部路径。

WITHRECURSIVE edges(a,b)as(VALUES(1,2),(1,3),(2,4),(4,5),(4,6)),dfs(stack,path)AS(SELECT[1]ASstack,[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Start with node 1 (root)UNIONALL(WITHsiblingsAS(SELECTARRAY_AGG(e.bORDERBYe.bASC)ASsiblings-- ^^^-- This determines the order of traversal of the siblingsFROMdfsASdft,edgesASeWHEREdft.stack[1]=e.a)SELECTx.*FROMsiblingsAS_(s),LATERAL(SELECTs||dft.stack[2:]ASstack,-- Push the stackdft.path||[{'from': dft.stack[1],'to': s[1]}]ASpath-- Add the edge to the pathFROMdfsASdftWHEREarray_length(s)>0-- There are more siblings to traverseUNIONALLSELECTdft.stack[2:],-- Pop the stack[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Reset the pathFROMdfsASdftWHEREarray_length(s)ISNULLANDdft.stack<>[]-- No more siblings to traverse)ASx))SELECT*FROMdfs;┌───────────┬────────────────────────────────────────────────────────────────────┐ │ stack │ path │ │ int32[]│ struct("from"integer,"to"integer)[]│ ├───────────┼────────────────────────────────────────────────────────────────────┤ │[1][]│ │[2,3][{'from':1,'to':2}]│ │[4,3][{'from':1,'to':2},{'from':2,'to':4}]│ │[5,6,3][{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':5}]│ │[6,3][]│ │[3][]│ │[][]│ └───────────┴────────────────────────────────────────────────────────────────────┘
http://www.rkmt.cn/news/127805.html

相关文章:

  • Windows10/11右键-超级菜单(动态菜单)批处理安装,所有任务、环境变量、设备管理器、网络链接、设备和打印机、重启资源管理器、电源选项、 区域语言、查看串口、获取本机IP等
  • 灵活用工平台,我的实践复盘
  • 实用指南:【javaEE】多线程进阶--CAS与原子类
  • 大模型微调实战指南:从全参数微调到BitFit的低成本学习路径
  • AI写论文哪个软件好?9款AI论文写作软件实测,查重率低至6%!
  • 11.20 脚本网页 数学分支
  • 第4章 运算符
  • 本地运行可以打印东西,docker run后却没有日志产生?记录一次AI编程的小蠢行为
  • 排序--基数排序
  • 好友圈模块 Cordova 与 OpenHarmony 混合开发实战
  • 好友圈模块 Cordova 与 OpenHarmony 混合开发实战
  • 3D打印与低压灌注硅胶复模小批量零件生产制造
  • 快!太快了!一键生成!一键导出!微信自动统计数据报表来了!
  • 设计模式的概念
  • 【硬件设计】DC12V输入的防护+滤波设计
  • 洞察:阿里通义DeepResearch 技术
  • 智能建议模块 Cordova 与 OpenHarmony 混合开发实战
  • epoll
  • Item3--尽可能使用 const
  • 工厂模式
  • 2025 最新广州澳洲留学机构 TOP5 评测!大湾区优质教育培训机构,课程体系+升学保障权威榜单发布,助力学子圆梦世界名校 - 全局中转站
  • 160. 相交链表
  • AI也会“三思而后答“?揭秘Self-RAG智能检索术
  • 多语言AI翻译引擎助力跨语种论文写作,保持学术术语准确性
  • 19、AdobeAcrobatProDC
  • 如何理解 Agentic AI、LLM格局
  • Type-C领夹麦:重塑移动收音新体验
  • Item1--C++ 是语言联邦
  • 基于SVPWM改进的异步电机/感应电机直接转矩控制:解决传统DTC转矩纹波大的问题“参考文...
  • 光伏大棚智慧管理:ELK数据中枢