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