![](/img/trans.png)
[英]Using CONNECT BY to get all parents and one child in Hierarchy through SQL query in Oracle
[英]How to get all values in hierarchy linked to some value using Oracle CONNECT BY
關系模型是
1 3
\ / \
2 4
\
7 5 8
\ / /
6 9
表是:
select 2 child, 1 father from dual
union all
select 2 child, 3 father from dual
union all
select 4 child, 3 father from dual
union all
select 7 child, 2 father from dual
union all
select 6 child, 5 father from dual
union all
select 6 child, 7 father from dual
union all
select 9 child, 8 father from dual
如何獲得與CHILD或FATHER = 2值鏈接的所有值?
肯定是
1,2,3,4,5,6,7
並不是
8,9
因為它不鏈接到值2。
如何通過使用CONNECT BY語句實現此目的? 謝謝。
ps這個解決方案離我很近,但不適用於我的模型:
使用oracle connect by查找鄰接表模型中的所有節點
數據庫版本-10.2.0.5.0
用Oracle連接模型
因此,近似策略可能是這樣的(例如,以node = 7開頭):
步驟1(方向=向上)
select t1.father,connect_by_root father as root,connect_by_isleaf from
(my_table) t1
start with father=7
connect by prior father = child
結果是7,2,1,3,其中1,3是高級根(isleaf = 1)
步驟2(取得1,3方向的路線=下)
select t1.child,connect_by_root father as root,connect_by_isleaf from
(my_table) t1
start with father=1
connect by father = prior child
結果是2,7,6,其中6是低級根(isleaf = 1)
select t1.child,connect_by_root father as root,connect_by_isleaf from
(my_table) t1
start with father=3
connect by father = prior child
結果是2,7,6,4,其中6,4是低級根(isleaf = 1)
第3步(獲取6,4個方向的路線=向上)
select t1.father,connect_by_root father as root,connect_by_isleaf from
(my_table) t1
start with child=6
connect by prior father = child
結果是5,7,2,1,3,其中5,1,3是高級根(isleaf = 1)是我找到了node = 5的結果嗎?
然后我必須將方向更改為向下..然后再次向上..然后再次向下..
但是如何將所有這些步驟整合到一個選擇中呢? 對於初學者來說很難。 請幫幫我。
對於您的輸出,您不需要定向圖形,因此將反向鏈接添加到所有現有鏈接。 這就是我在子查詢“ bi”中所做的事情。 然后,您可以使用Nocyle通過查詢進行連接。
with h as (
SELECT 2 child, 1 father FROM dual
UNION ALL
SELECT 2 child, 3 father FROM dual
UNION ALL
SELECT 4 child, 3 father FROM dual
UNION ALL
SELECT 7 child, 2 father FROM dual
UNION ALL
SELECT 6 child, 5 father FROM dual
UNION ALL
SELECT 6 child, 7 father FROM dual
UNION ALL
SELECT 9 child, 8 father FROM dual
),
bi as (select * from h union all select father , child from h )
select distinct father from bi
start with child = 2
connect by nocycle
prior father = child
我在查詢中使用“ with”符號,以提高可讀性。
這是您要的:
SELECT child
FROM (
SELECT 2 child, 1 father FROM dual
UNION ALL
SELECT 2 child, 3 father FROM dual
UNION ALL
SELECT 4 child, 3 father FROM dual
UNION ALL
SELECT 7 child, 2 father FROM dual
UNION ALL
SELECT 6 child, 5 father FROM dual
UNION ALL
SELECT 6 child, 7 father FROM dual
UNION ALL
SELECT 9 child, 8 father FROM dual
)
START WITH father IN ( SELECT father
FROM
(
SELECT 2 child, 1 father FROM dual
UNION ALL
SELECT 2 child, 3 father FROM dual
UNION ALL
SELECT 4 child, 3 father FROM dual
UNION ALL
SELECT 7 child, 2 father FROM dual
UNION ALL
SELECT 6 child, 5 father FROM dual
UNION ALL
SELECT 6 child, 7 father FROM dual
UNION ALL
SELECT 9 child, 8 father FROM dual
)
START WITH child = 2
CONNECT BY PRIOR father = child)
CONNECT BY PRIOR child = father
UNION
SELECT father
FROM (
SELECT 2 child, 1 father FROM dual
UNION ALL
SELECT 2 child, 3 father FROM dual
UNION ALL
SELECT 4 child, 3 father FROM dual
UNION ALL
SELECT 7 child, 2 father FROM dual
UNION ALL
SELECT 6 child, 5 father FROM dual
UNION ALL
SELECT 6 child, 7 father FROM dual
UNION ALL
SELECT 9 child, 8 father FROM dual
)
START WITH child IN (
SELECT child
FROM (
SELECT 2 child, 1 father FROM dual
UNION ALL
SELECT 2 child, 3 father FROM dual
UNION ALL
SELECT 4 child, 3 father FROM dual
UNION ALL
SELECT 7 child, 2 father FROM dual
UNION ALL
SELECT 6 child, 5 father FROM dual
UNION ALL
SELECT 6 child, 7 father FROM dual
UNION ALL
SELECT 9 child, 8 father FROM dual
)
START WITH child = 2
CONNECT BY PRIOR child = father)
CONNECT BY PRIOR father = child;
該查詢包含兩個塊。 第一個塊提取2個所有父親的所有孩子的父親(參數),第二個塊(使用聯合以避免重復)提取2個所有孩子的所有父親的父親。
如果我理解正確,則可以使用connect_by_root函數,如下所示:
select hier.child , hier.father
from
(
select t.* , connect_by_root(father) top_father
from
(
select 2 child, 1 father from dual
union all
select 2 child, 3 father from dual
union all
select 4 child, 3 father from dual
union all
select 7 child, 2 father from dual
union all
select 6 child, 5 father from dual
union all
select 6 child, 7 father from dual
union all
select 9 child, 8 father from dual
) t
connect by t.child = prior t.father
) hier
where 2 in (hier.child , hier.top_father);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.