好人,
让我们假设像这样的树:
A(100张)|+-B(50)| || C(NULL)| || E(空)|+-D(30)|B(20张)
在这棵树中,字母代表节点的名称,括号内的数字代表一些值。我知道如何使用分层查询(使用connect by等)对所有节点进行爬网。但是,如果当前节点的值为null,我想检索(大)父节点的非null值。因此,这样的查询应产生如下表:
姓名家长值空值100B A 50B D 20炭黑50D A 30E C 50
你们中有人知道如何实现这一目标吗?
到目前为止的代码:
SELECT NAME, PARENT,
CASE VALUE
WHEN IS NULL THEN (SELECT VALUE FROM SOMETABLE WHERE NAME = PARENT) -- this returns more than one value
ELSE VALUE
END CASE AS VALUE
FROM SOMETABLE
START WITH NAME='A'
CONNECT BY NOCYCLE PRIOR NAME = PARENT
编辑:
代替具有父引用的表,您最好考虑具有子引用的表,如下所示:
儿童姓名A B 100A D 100B C 50C E空E NULL NULLD B 30B空20
应翻译为:
儿童姓名A B 100A D 100B C 50C E 50E空50D B 30B空20
您的数据存在的问题是B
有两个父节点,也有子节点,因此树的这一部分被复制。无论如何,您都可以通过递归CTE轻松实现目标:
with c(name, parent, value) as (
select name, parent, value from sometable where name = 'A' union all
select t.name, t.parent, nvl(t.value, c.value)
from c join sometable t on c.name = t.parent)
select * from c
[dbfiddle demo] >>