分层SQL / PL查询中父母的最新值

问题描述 投票:1回答:1

好人,

让我们假设像这样的树:

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
sql oracle hierarchical-data
1个回答
1
投票

您的数据存在的问题是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] >>

© www.soinside.com 2019 - 2024. All rights reserved.