【发布时间】:2013-10-24 20:59:40
【问题描述】:
假设我的 oracle DB 中有下表:
ID: Name: Parent_ID:
123 a 234
345 b 123
234 c 234
456 d 345
567 e 567
678 f 567
而我想做的是为每个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
我今天刚刚发现 Oracle Connect By statments,所以这对我来说是全新的,但我想我的查询必须看起来如下:
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;
现在,就像我说的,这是我第一次尝试这种 SQL - 这不起作用(我收到以下错误 [1]: ORA-01436: CONNECT BY loop in user data 并在 SQL 编辑器中突出显示表名),而且我也不知道在哪里/如何使用 START WITH 子句进行此类查询,但它的逻辑对我来说似乎是正确的。
请帮助/帮助我指出正确的方向!!!
谢谢!!!
【问题讨论】:
-
请解释“不起作用”。您是否收到任何错误或只是错误的结果?
-
抱歉 - 错误解释 - 我收到以下错误
[1]: ORA-01436: CONNECT BY loop in user data并突出显示查询中的表名...抱歉...我现在也将更新 Q -
尝试添加
NOCYCLE子句,看看你是否同意这个结果。 -
如果您可以控制数据库内容,可能拥有 root 行,
Parent_ID为NULL,即没有完全是父母。 -
感谢@PM77-1 - 是的,感谢您的提示它适用于 nocycle 子句并给了我正确的结果...我仍然不知道如何1)使其适用于所有记录(不仅适用于要检查的 1 条记录)和 2)使其在没有该条款的情况下工作。但是,是的,数据看起来是正确的。另外,不幸的是,我无法控制数据库 - 我只有查询权限...
标签: sql database oracle plsql recursive-query