sql - 如何通过行层次结构进行 SQL 查询?
问题描述
假设我在 Oracle 数据库中具有以下表结构,其中 PARENT 引用同一表中的另一行。
id | parent
1 | null
2 | 1
3 | 2
4 | 3
5 | null
6 | 5
7 | 6
我如何查询,以便每一行都让我知道序列的结尾。那就是我想看到这个最终结果:
id | end_parent
1 | 4
2 | 4
3 | 4
4 | 4
5 | 7
6 | 7
7 | 7
解决方案
以下查询显示了您想要的结果,在 Oracle 12c 上进行了测试:
with
x (id, parent, origin, generation) as (
select id, parent, id, 1 from my_table where parent is null
union all
select t.id, t.parent, x.origin, x.generation + 1
from my_table t
join x on t.parent = x.id
),
y (id, parent, generation, origin, rn) as (
select id, parent, generation, origin,
row_number() over(partition by origin order by generation desc) as rn
from x
),
z (id, origin) as (
select id, origin from y where rn = 1
)
select x.id, z.id as end_parent
from x
join z on x.origin = z.origin
order by x.id
结果:
ID END_PARENT
-- ----------
1 4
2 4
3 4
4 4
5 7
6 7
7 7
作为参考,这是我使用的数据:
create table my_table (
id int,
parent int
);
insert into my_table (id, parent) values (1, null);
insert into my_table (id, parent) values (2, 1);
insert into my_table (id, parent) values (3, 2);
insert into my_table (id, parent) values (4, 3);
insert into my_table (id, parent) values (5, null);
insert into my_table (id, parent) values (6, 5);
insert into my_table (id, parent) values (7, 6);
推荐阅读
- windows - 如何让 Windows 上的 docker-compose 尊重我的终端大小?
- ios - 如何保存具有指定填充和角半径的图像?
- node.js - 每当我创建一个反应应用程序时,它都无法编译
- testing - 如何在模拟器的网站上使用网络摄像头、麦克风、扬声器?
- jquery - 按钮单击后淡出画布中的每个框(动画)
- c# - 具有属性的singelton类的依赖注入
- python - 有没有一种技术可以分析时间序列集群之间的关系?
- c++ - llvm 的 dyn_cast 是否仍用作 dynamic_cast 的替代品?
- php - 以编程方式创建的产品未显示在商店页面上
- c++ - (C++)当我按顺序遍历树时,发生运行时错误