我在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
现在,我所能得到的只是查询所需结果的一小部分:
select connect_by_root(id) root_id, id, parent_id from my-table
start with id=1
connect by prior id = parent_id
我不想使用任何for
循环来获取完整的结果。
任何的想法 ?
最好的问候,J茅r么我Lefr猫re
PS:在第一个答案之后编辑,注意到我忘记了一些我想要的结果…
您发布的查询缺少该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
可以返回表的全部内容。
我还添加了外部查询,以从结果集中过滤出根行,这在您的问题中没有提到,但已显示在您想要的结果中。
SQL小提琴示例
评论回应:
在提供的版本中,您确实可以获取的后代id = 3
,但不能以其3
为根。这是因为我们从绝对根开始。解决这个问题很容易,只需省略以下start with
子句:
SELECT *
FROM
(SELECT connect_by_root(id) root_id,
id,
parent_id
FROM test1
CONNECT BY
PRIOR id = parent_id)
WHERE root_id <> id
问题内容: Oracle附带了一个非常方便的功能。您可以使用以下子句创建分层查询(递归行为): 如此处记录: http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries003.htm 我想知道,是否还存在其他支持等效或相似语法的RDBMS?还是可以使用常规SQL对这种递归行为进行一般性的模拟? 我想能够模拟的一个很好
问题内容: 我试图找到一个特定领域的所有深度的父母,祖父母等。例如,给定以下结构,如果我提供5,则返回的值应为1、2、3和4。 我该怎么做? 问题答案:
问题内容: 我希望我能够解释困扰我的问题。我有以下分层数据集(这只是34K记录的子集) 这是树的代表 我需要的是清单的所有记录,带有exam = N和潜在的extest =’J’记录,可以嵌套。 给我 但是我需要的是 当我遇到EXAM =’N’记录时,需要停止运行。 我需要类似“停止于”子句的内容。 如何才能做到这一点? 问题答案: 罗伯特 您可以通过在connect by子句中添加“ exam
问题内容: 对我来说,这是一个永无止境的话题,我想知道我是否会忽略某些事情。本质上,我在应用程序中使用两种类型的SQL语句: 具有“后备”限制的常规查询 排序查询和分页查询 现在,我们讨论的是针对具有几百万条记录的表的一些查询,再加上另外五个具有几百万条记录的表的查询。显然,我们几乎不希望全部获取它们,这就是为什么我们有上述两种方法来限制用户查询的原因。 情况1 确实很简单。我们只是添加了一个额外
我有Oracle表: 数据 Oracle是否支持产生以下输出的查询?--删除重复并将其分组到单个JSON数组中 版本: Oracle数据库12c企业版发布12.2.0.1.0-64位生产
我知道可能的性能问题,但是我们可以使用Hibernate/JPA映射类似的东西吗?