sql - 递归加入最近的祖先/父母以在同一个表中记录?
问题描述
根据这个问题的标题,我试图在具有特定属性(以最接近的父记录)的同一个表中递归地与另一条记录连接记录,但我不完全确定如何处理这个。
我在这里和这里进行了检查,但遗憾的是对于我所需的用例来说不够具体。
示例 SQLFiddle:
http://sqlfiddle.com/#!18/0c5fb/2
我试图实现的最终结果是这样的,其中每一行都知道其最接近的祖先,其中 NeededElement 为真:
元素ID | 元素名称 | 需要元素 | 父元素 ID | ClosestNeededElementID |
---|---|---|---|---|
1 | 根元素 | 真的 | (无效的) | (无效的) |
2 | 子元素 A | 真的 | 1 | 1 |
3 | 子元素 B | 错误的 | 1 | 1 |
4 | 子元素 AA | 错误的 | 2 | 2 |
5 | 子元素 AB | 错误的 | 2 | 2 |
6 | 子元素 BA | 错误的 | 3 | 1 |
7 | 子元素 BB | 错误的 | 3 | 1 |
提前谢谢了!
解决方案
您可以使用条件为最近的父级保留一个运行列:
with cte(id, name, n_elem, p, l) as (
select *, null from testelements where parentelementid is null
union all
select t.*, case when c.n_elem = 1 then c.id else c.l end
from cte c join testelements t on t.parentelementid = c.id
)
select * from cte;
推荐阅读
- javascript - NodeJS Var 未定义自身?
- c++ - 使用贪心算法解决方案的汽车加油问题给出了错误的输出
- ssl - 如何在加特林中关闭 TLSv1.3?
- hibernate - JPA 从具有复合主键的子实体的子实体中获取父实体
- mysql - 当我没有从本地主机连接客户端时,MySQL/MariaDB 将“本地主机:端口”显示为主机
- android - 卸载firebase后保留匿名凭据 - Android
- c# - 如何在sql中计算员工的工作时间
- pubnub - pubnub-angular2 中没有 setChannelMetadata() 函数
- shell - 给定列表所需的端口范围
- docker - 来自 docker 容器的实时日志