簡體   English   中英

通過事先得到父母和孩子的聯系

[英]Connect by prior get parents and children

我正在研究使用按先連接的查詢。 我寫了一個查詢,檢索實體的所有子級。 我想要的是檢索孩子和父母的行。

這是我的SQL:

Select *
From myTable tab
Connect By Prior tab.id= tab.child_id
Start With tab.id= 2;

我該如何找回父母? 謝謝。

使用UNION ALL組合一個查詢來獲得子項,再通過一個查詢來獲得祖先。

SQL小提琴

Oracle 11g R2架構設置

CREATE TABLE myTable ( id, child_id ) AS
SELECT 0, 1 FROM DUAL UNION ALL
SELECT 1, 2 FROM DUAL UNION ALL
SELECT 2, 3 FROM DUAL UNION ALL
SELECT 3, 4 FROM DUAL UNION ALL
SELECT 4, 5 FROM DUAL UNION ALL
SELECT 3, 6 FROM DUAL UNION ALL
SELECT 0, 7 FROM DUAL UNION ALL
SELECT 1, 8 FROM DUAL;

查詢1

SELECT *                        -- Child Rows
FROM   mytable
START WITH id = 2
CONNECT BY PRIOR child_id = id
UNION ALL
SELECT *                        -- Ancestor Rows
FROM   mytable
START WITH child_id = 2
CONNECT BY PRIOR id = child_id

結果

| ID | CHILD_ID |
|----|----------|
|  2 |        3 |
|  3 |        4 |
|  4 |        5 |
|  3 |        6 |
|  1 |        2 |
|  0 |        1 |

如果您使用的是11gR2或更高版本,則分層查詢的另一種方法是遞歸子查詢分解

with rcte (id, child_id, some_other_col) as (
  select id, child_id, some_other_col -- whichever columns you're interested in
  from myTable
  where id = 2
  union all
  select t.id, t.child_id, t.some_other_col  -- whichever columns you're interested in
  from rcte r
  join myTable t
  on t.id = r.child_id -- match parents
  or t.child_id = r.id -- match children
)
cycle id set is_cycle to 1 default 0
select id, child_id, some_other_col  -- whichever columns you're interested in
from rcte
where is_cycle = 0;

錨成員找到您的初始目標行。 然后,遞歸成員將查找到目前為止找到的每一行的父母孩子。

最終查詢可以獲取所需的任何列,進行匯總等。

(當然,可能值得用真實數據測試這兩種方法,以查看是否存在性能差異)。

暫無
暫無

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

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