sql - Oracle Connect By Prior 递归查询语法

标签 sql database oracle plsql recursive-query

假设我的 oracle 数据库中有下表:

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 的声明,所以这对我来说是全新的,但我想我的查询必须如下所示:

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在用户数据中循环 并在 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
;

这给出:

456 d   234 c
345 b   234 c
123 a   234 c
234 c   234 c
678 f   567 e
567 e   567 e

关于sql - Oracle Connect By Prior 递归查询语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19408622/

相关文章:

spring - 通过 BeanPropertySqlParameterSource 存储枚举属性失败并出现 SQLException : Invalid conversion requested

sql - Oracle:小数和四舍五入

mysql - 什么是动态 SQL?

sql - 使用 SQL 查询在 Postgresql 中获取函数、序列、类型等的定义

sql - PostgreSQL 非标准选择(分组)

MySQL - 嵌入式选择 - 如何将行放入列中?

MySQL 多对多关系的限制

c# - 如何将数据插入到特定行 MySQL C#

php - 在sql语句中使用php $_SESSION

java - 长时间运行查询超时