sql - 拓扑排序的 SQL 查询
问题描述
我有一个有向无环图:
DROP TABLE IF EXISTS #Edges
CREATE TABLE #Edges(from_node int, to_node int);
INSERT INTO #Edges VALUES (1,2),(1,3),(1,4),(5,1);
我想列出所有节点,总是在它的 from 节点之前列出一个 to 节点。例如:2、3、4、1、5。
它也称为拓扑排序。如何在 SQL 中完成?
解决方案
您可以使用递归 CTE 来计算深度。然后按深度排序:
with cte as (
select e.from_node, e.to_node, 1 as lev
from edges e
where not exists (select 1 from edges e2 where e2.to_node = e.from_node)
union all
select e.from_node, e.to_node, lev + 1
from cte join
edges e
on e.from_node = cte.to_node
)
select *
from cte
order by lev desc;
编辑:
我注意到您的边缘列表中没有“1”。要处理这个:
with cte as (
select 1 as from_node, e.from_node as to_node, 1 as lev
from edges e
where not exists (select 1 from edges e2 where e2.to_node = e.from_node)
union all
select e.from_node, e.to_node, lev + 1
from cte join
edges e
on e.from_node = cte.to_node
-- where lev < 5
)
select *
from cte
order by lev desc;
这是一个 db<>fiddle。
推荐阅读
- c# - 如何通过在 C# 中为实例赋值来设置类中的属性
- flutter - Flutter 布局障碍
- angular - 当 api 响应有数据并且我已经订阅时,数据没有显示在屏幕上,Angular 6
- javascript - Javascript 单击网页中的特定按钮
- c - c编程,创建存储指针的动态数组,struc
- excel - 出现运行时错误 6:在非常简单的 Excel VBA 代码中溢出(Mac)
- java - android上的Bitcoinj库挂在安装APK上
- javascript - 尝试创建表 IE10 时 Handsontable Hooks undefined 或 null
- sql - 当列中的值不匹配时,SQL 查询返回行
- bash - 仅对子目录应用 chown -R 并限制递归的深度