Oracle 10g PL/SQL Connect By Prior 在同一行返回 Child 和 Parent

标签 oracle parent-child hierarchical-data connect-by

Table1:

Child     Parent       a

Bob        Chris       2
Chris      Kate        1
Shane      Lana        3
Nala       Bob         4


Table2:

b           Talent      

1           'something'
2           'nothing'
3           'something'
4           'nothing'

SELECT  Child
FROM Table1
INNER JOIN Table2 ON (Table1.a =  Table2.b)
WHERE Table2.Talent = 'something'
connect by prior  Table1.Child =  Table1.Parent

此代码返回 parent 行

克里斯

如果不包含“Where”子句,代码将返回:

Bob
Chris
Kate

Chris
Kate

Shane
Lana

etc

我要返回的是一行中的以下内容,而不是列中的内容:

鲍勃·克里斯

其中 Chris 是一个有才能的人并且是 Bob 的父亲,因此代码不仅返回父亲,还返回发起对父亲的查询的 child ,因此在这段代码中:

SELECT  Child
FROM Table1
INNER JOIN Table2 ON (Table1.a =  Table2.b)
WHERE Table2.Talent = 'something'
connect by prior  Table1.Child =  Table1.Parent

我将拥有具有天赋的 child 克里斯和发起寻找克里斯的前一个 child 鲍勃,所以假设鲍勃是加拉的 child 而加拉是克里斯的 child ,我仍然只想得到鲍勃和克里斯在结果中。

条件:我没有创建临时表或任何类型的表的权限,所以我不能使用任何循环来执行此操作除非我不知道如何在没有临时表的情况下执行此操作

我不知道如何从“先前”声明和实际上是前一个 child 的 parent 的新“ child ”之前返回一个 child 。

最佳答案

您只需使用 connect_by_root运算符(operator)。

我不确定查询目标(例如,如果 parent 没有天赋,则返回或不返回有天赋的祖父),但该运算符的用法可能如下所示:

select 
  originated_from_child, 
  found_ancestor, 
  is_ancestor_talented
from (
  select 
    CONNECT_BY_ROOT relations.child  originated_from_child,
    relations.parent                 found_ancestor,
    ( 
      select count(1) 
      from table2 
      where 
        b = a 
        and 
        talent = 'something' 
        and 
        rownum = 1
    )                                is_ancestor_talented
  from 
    table1 relations
  start with 
    relations.a in (
      select talents.b 
      from table2 talents 
      where talents.talent = 'something')
  connect by 
    prior relations.child = relations.parent
)
where 
  originated_from_child <> found_ancestor
  and
  is_ancestor_talented = 1

SQLFiddle example

关于Oracle 10g PL/SQL Connect By Prior 在同一行返回 Child 和 Parent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446721/

相关文章:

mysql - 层次表-如何获取项目的路径[MySQL中的链表]

mysql - 嵌套集模型维护

sql - Oracle 转换错误时默认为 null - 时间戳

dom - React,获取组件内绑定(bind)的父dom元素名称

c# - 将 linq to sql 结果放入层次结构中,以便在无序列表中使用(对于 jquery 树)

java - GWT TextBox、DateBox 等不共享相同的基本输入类

javascript - 停止在额外点击时重新加载子页面

java - 我无法可视化位于 java 容器中的 Oracle 库中的表

algorithm - 如何将一组唯一的数值转换为一组较短长度的唯一字母数值?

sql - Oracle从表中选择第N行