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对这种查询使用该子句,但它的逻辑对我来说似乎是正确的.
请帮助/帮助指出我正确的方向!
谢谢!!!
我认为您需要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)