查看返回给定任何子节点的根节点(在 Oracle 中)

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

我们制造设备,并为我们生产的每台设备提供序列号 (s/n)。我们有一个父/子表,用于建立顶级程序集及其子程序集之间的关系。我在下面提供了此类表格的示例布局。

CREATE TABLE PAR_CHI
(
    PARENT_SN VARCHAR2(50 BYTE) NOT NULL,
    CHILD_SN VARCHAR2(50 BYTE) NOT NULL,
    PRIMARY KEY (PARENT_SN, CHILD_SN)
);

我有一些可以加载到此表中的数据,可以在下面找到。

insert into PAR_CHI values (' ', '135887957');
insert into PAR_CHI values ('135887957', '135562597');
insert into PAR_CHI values ('135562597', '135424162');
insert into PAR_CHI values ('135424162', '135422839');
insert into PAR_CHI values ('135887957', '135623876');
insert into PAR_CHI values ('135623876', '135519894');
insert into PAR_CHI values ('135519894', '135517981');
insert into PAR_CHI values ('135887957', '136526805');

我没有分层查询的经验,所以我做了一些关于它及其工作原理的在线研究。到目前为止,我已经了解到,像下面这样的查询可用于查找特定顶级程序集的“树”(或层次结构),以返回其完整的谱系。

select PARENT_SN, CHILD_SN, level, connect_by_root(CHILD_SN) as root, sys_connect_by_path(CHILD_SN, '/') as path, connect_by_isleaf
from PAR_CHI
start with CHILD_SN = '135887957'
connect by PARENT_SN = prior CHILD_SN;

我还了解到,像下面这样的查询可用于以相反的方向遍历层次结构(给定组件序列号,找到其父级并一直到达顶级组件)。

select PARENT_SN, CHILD_SN, level, connect_by_root(CHILD_SN) as root, sys_connect_by_path(CHILD_SN, '/') as path, connect_by_isleaf
from PAR_CHI
start with CHILD_SN = '135517981'
connect by CHILD_SN = prior PARENT_SN;

如果使用“connect_by_isleaf”,有一种方法可以获取特定序列号的“真实”父级,如下所示。

select PARENT_SN, CHILD_SN, level, connect_by_root(CHILD_SN) as root, sys_connect_by_path(CHILD_SN, '/') as path, connect_by_isleaf
from PAR_CHI
where connect_by_isleaf = 1
start with CHILD_SN = '135517981'
connect by CHILD_SN = prior PARENT_SN;

我有创建视图或表(最好是视图)的特定需求,但是这个对象,无论它是什么,都不能调用另一个对象来构建数据集(让我解释一下:例如,在 SSRS 报告中,我们可以调用存储过程将根据特定的搜索条件构建数据集,然后报告将显示数据集中的记录)。该对象必须准备好供用户对其执行直接的“选择语句”,并获得所需的结果。

该对象应每次返回一行,显示给定用户正在搜索的任何 s/n 的顶级程序集 s/n(根)。

让我提供一些给定搜索数据的预期结果的示例。

  1. 如果用户输入序列号“135887957”,数据集将返回一行显示以下值:

根序列号 搜索到的序列号 135887957

此记录对应于顶级程序集本身,并且“Root s/n”列为空(不为空)。

  1. 如果用户输入序列号“135562597”,数据集将返回一行显示以下值。

根序列号 搜索序列号 135887957 135562597

此记录显示输入的序列号“135562597”具有根序列号“135887957”。由于这是一个 2 级组件,因此结果返回顶级组件。

  1. 如果用户输入序列号“135519894”,数据集将返回一行显示以下值。

根序列号 搜索序列号 135887957 135519894

这条记录显示,输入的s/n'135519894'的根s/n'135887957'(严格来说,这个3级组件的'父级'是'135623876',但是我们需要获取顶级组件,不是“真正的”父母)。

  1. 如果用户输入序列号“135422839”,数据集应返回一行显示以下值。

根序列号 搜索到的序列号 135887957 135422839

这条记录显示,输入的s/n'135422839'的根s/n'135887957'(严格来说,这个4级组件的'父级'是'135424162',但是我们需要获取顶级组件,不是“真正的”父母)。

如您所见,我们实际上并不需要任何其他数据,例如关卡、“真实”父级或路径,但如果我们可以添加它,那将会很有帮助;只是与顶级程序集相对应的序列号。我在其他帖子中看到的代码与我的具体需求之间的一个很大的区别是我们没有“起点”;所有查询都使用“start with”语句,但由于我们需要将其放入视图中,因此我们实际上没有那个起始记录来开始搜索。

任何人都可以建议我们如何根据我们的需求构建这个对象吗?

提前致谢。

view oracle19c hierarchical-query
1个回答
0
投票

在示例中,根元素不应该有任何父元素,如果您删除空白并重新创建表格,那么您现有的解决方案应该可以工作。

CREATE TABLE PAR_CHI
(PARENT_SN VARCHAR2(50 BYTE) ,
 CHILD_SN VARCHAR2(50 BYTE) NOT NULL
);
create or replace view test_hierarchy as 
select PARENT_SN, CHILD_SN as ROOT, level level_in, 
connect_by_root(CHILD_SN) as Searched_val, 
sys_connect_by_path(CHILD_SN, '/') as path
from PAR_CHI
where connect_by_isleaf = 1
--start with CHILD_SN = '135422839'
connect by CHILD_SN = prior PARENT_SN
;

您可以查询此视图并传递序列号进行搜索,它将为您提供所有必填字段

sample

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