我在Oracle11g中有一个具有(id,parent_id)结构的表。
id parent_id --------------- 1 (null) 2 (null) 3 1 4 3 5 3 6 2 7 2
我想对其进行查询,以获取与这些ID各自分层链接的所有行,因此结果应为:
root_id id parent_id ------------------------ 1 3 1 1 4 3 1 5 3 2 6 2 2 7 2 3 4 3 3 5 3
我一直在connect by和上苦苦挣扎,start with现在,我所能得到的只是查询所需结果的一小部分:
connect by
start with
select connect_by_root(id) root_id, id, parent_id from my-table start with id=1 connect by prior id = parent_id
我不想使用任何for循环来获取完整的结果。
for
任何的想法 ?
最好的问候,J茅r么我Lefr猫re
PS:在第一个答案之后编辑,注意到我忘记了一些我想要的结果…
您发布的查询缺少该from子句,并在下划线下划线connect_by_root,但我认为这些实际上并不是问题的根源。
from
connect_by_root
以下查询为您提供所需的结果:
select * from ( select connect_by_root(id) root_id, id, parent_id from test1 start with parent_id is null connect by prior id = parent_id) where root_id <> id
中心问题是您要指定一个特定的值开始,而不是指定一种方法来标识根行。更改id = 1为parent_id is null可以返回表的全部内容。
id = 1
parent_id is null
我还添加了外部查询,以从结果集中过滤出根行,这在您的问题中没有提到,但已显示在您想要的结果中。
SQL小提琴示例
评论回应:
在提供的版本中,您确实可以获取的后代id = 3,但不能以其3为根。这是因为我们从绝对根开始。解决这个问题很容易,只需省略以下start with子句:
id = 3
3
SELECT * FROM (SELECT connect_by_root(id) root_id, id, parent_id FROM test1 CONNECT BY PRIOR id = parent_id) WHERE root_id <> id