Oracle Connect By Prior用于递归查询语法

Joh*_*tos 7 sql database oracle plsql recursive-query

假设我的oracle DB中有以下表:

ID:    Name:     Parent_ID:
123    a         234
345    b         123
234    c         234
456    d         345
567    e         567
678    f         567
Run Code Online (Sandbox Code Playgroud)

而我想要做的是找到每ID一个ULTIMATE parent ID(描述为行,当你上升时,递归地,基于Parent_ID你最终得到的那一行ID = Parent_ID).

所以,例如,345的父母是123,123的父母是234,234的父母是234(意味着它是链的顶端),因此345的最终父母是234 - 我希望这是有道理的...

所以,我的结果应如下所示:

ID:    Name:     Ult_Parent_ID:    Ult_Parent_Name:
123    a         234               c
345    b         234               c
234    c         234               c
456    d         234               c
567    e         567               e
678    f         567               e
Run Code Online (Sandbox Code Playgroud)

Connect By今天刚刚发现了有关Oracle 语句的内容,所以这对我来说是全新的,但我想我的查询必须看起来像SOMETHING如下:

SELECT ID, Name, Parent_ID as Ult_Parent_ID, 
   (SELECT Name from MyTable t2 WHERE t2.ID = t1.Parent_ID) as Ult_Parent_Name
FROM MyTable t1
CONNECT BY PRIOR Parent_ID = ID;
Run Code Online (Sandbox Code Playgroud)

现在,就像我说的,这是我对这种SQL的第一次尝试 - 这不行(我得到以下错误[1]: ORA-01436: CONNECT BY loop in user data,它突出了SQL编辑器中的表名),而且我也不知道在哪里/如何START WITH对这种查询使用该子句,但它的逻辑对我来说似乎是正确的.

请帮助/帮助指出我正确的方向!

谢谢!!!

Emm*_*uel 5

我认为您需要CONNECT_BY_ROOT:

select x.*, t2.name ultimate_name
from
(
  select t.id, t.name, CONNECT_BY_ROOT parent_id ultimate_id
  from toto t
  start with t.id = t.parent_id
  connect by nocycle prior id = parent_id
) x, toto t2
where x.ultimate_id = t2.id
;
Run Code Online (Sandbox Code Playgroud)

这给出:

456 d   234 c
345 b   234 c
123 a   234 c
234 c   234 c
678 f   567 e
567 e   567 e
Run Code Online (Sandbox Code Playgroud)