[英]interconnected data with recursive hierarchy
我有一個表親屬如下
| Name | Id | Rel_Id |
--------------------------
| A | 1 | 2 |
| B | 1 | 3 |
| C | 1 | 4 |
| D | 5 | 1 |
| E | 6 | 1 |
| F | 7 | 2 |
| G | 2 | 8 |
| H | 9 | 8 |
| I | 10 | 11 |
我希望獲取1的所有親屬,然后遞歸他們的Id列或Rel_id列中的親屬。 所以對於id OR rel_id = 1,我打算拉A,B,C,D,E,F,G,H而不是I.
我嘗試在oracle 12c中使用oracle層次結構sql。
select
dd.*
from relatives dd
start with id = 1
connect by id = prior rel_ID
union
select
dd.*
from relatives dd
start with rel_ID = 1
connect by Id = prior rel_ID;
它不會拉動隨后的相對ID(F或H)。
您可以使用CONNECT BY
子句中的多個OR
條件實現此目的,如下所示:
SQL> WITH DATAA ( Name, Id, Rel_Id)
2 AS
3 (
4 SELECT 'A', 1, 2 FROM DUAL UNION ALL
5 SELECT 'B', 1, 3 FROM DUAL UNION ALL
6 SELECT 'C', 1, 4 FROM DUAL UNION ALL
7 SELECT 'D', 5, 1 FROM DUAL UNION ALL
8 SELECT 'E', 6, 1 FROM DUAL UNION ALL
9 SELECT 'F', 7, 2 FROM DUAL UNION ALL
10 SELECT 'G', 2, 8 FROM DUAL UNION ALL
11 SELECT 'H', 9, 8 FROM DUAL UNION ALL
12 SELECT 'I', 10, 11 FROM DUAL
13 )
14 SELECT DISTINCT *
15 FROM
16 DATAA
17 START WITH ID = 1
18 CONNECT BY ( PRIOR ID = ID OR PRIOR ID = REL_ID
19 OR PRIOR REL_ID = ID OR PRIOR REL_ID = REL_ID )
20 AND PRIOR NAME < NAME -- used this condition to avoid looping
21 ORDER BY NAME;
N ID REL_ID
- ---------- ----------
A 1 2
B 1 3
C 1 4
D 5 1
E 6 1
F 7 2
G 2 8
H 9 8
8 rows selected.
SQL>
干杯!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.