簡體   English   中英

查看以返回給定任何子節點的根節點(在 Oracle 中)

[英]View to return the root node given any children (in Oracle)

我們制造設備,並為我們生產的每台設備提供一個序列號 (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;

我還了解到,像下面這樣的查詢可用於以相反的方向遍歷層次結構(給定組件 s/n,以查找其父級並一直到頂級組件)。

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. 如果用戶輸入 s/n '135887957',數據集將返回一行顯示以下值:

根 S/N 已搜索 S/N 135887957

此記錄對應於頂級程序集本身,並且“Root s/n”列為空白(非空)。

  1. 如果用戶輸入 s/n '135562597',數據集將返回一行顯示以下值。

根 S/N 已搜索 S/N 135887957 135562597

此記錄顯示輸入的 s/n '135562597' 具有根 s/n '135887957'。 由於這是一個 2 級組件,因此結果返回頂級程序集。

  1. 如果用戶輸入 s/n '135519894',數據集將返回一行顯示以下值。

根 S/N 已搜索 S/N 135887957 135519894

這條記錄顯示輸入的s/n '135519894'有root s/n '135887957'(嚴格來說,這個3級組件的'parent'是'135623876',但是我們需要得到頂層組件,而不是“真正的”父母)。

  1. 如果用戶輸入 s/n '135422839',則數據集應返回顯示以下值的一行。

根 S/N 已搜索 S/N 135887957 135422839

這條記錄顯示輸入的s/n '135422839'有root s/n '135887957'(嚴格來說,這個4級組件的'parent'是'135424162',但是我們需要得到頂層組件,而不是“真正的”父母)。

如您所見,我們實際上並不需要任何其他數據,例如關卡、“真正的”父級或路徑,但如果我們可以添加它,那將會很有幫助; 只是對應於頂級程序集的 s/n。 我在其他帖子中看到的代碼與我的特定需求之間的一大區別是我們沒有“起點”。 那里的所有查詢都使用“start with”語句,但是由於我們需要將其放在視圖中,因此我們實際上並沒有開始搜索的起始記錄。

鑒於我們的需求,有人可以建議我們如何構建這個對象嗎?

提前致謝。

在示例中,根元素不應有任何父元素,如果您刪除空白並重新創建表,那么您現有的解決方案應該可以工作。

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
;

您可以查詢此視圖並將序列號傳遞給搜索,它將為您提供所有必填字段

樣本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM