互连的数据与递归层次结构

3
我有一个如下的亲戚表。
| 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或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)。


1
你刚才写了完全相同的 SELECT 语句两次。其中一个应该有 connect by rel_id = prior id - user5683823
然而,请注意这只找到直接的后代和祖先,它不会找到所有1的亲戚的亲戚。例如,如果您还有一行值为J 5 20的行呢?5与1有关,5也与20有关,但您甚至在更正的查询中也找不到20。事实上,那是你需要做的吗?那比你想象的要难得多。 - user5683823
嗨 @mathguy,是的,我也想获取 20。如果 1 与 5 相关联,并且 5 与 20 相关联,则 20 也是相关联的。 - user1582625
只是好奇,SQL Server使用递归CTE语句解决了这个问题,Oracle中没有相应的吗? - Charleh
1个回答

5

您可以使用以下多个OR条件在CONNECT BY子句中实现此操作:

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>

欢呼!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接