Oracle分层查询数据
Posted
技术标签:
【中文标题】Oracle分层查询数据【英文标题】:Oracle hierarchical queries data 【发布时间】:2021-03-05 04:03:56 【问题描述】:link 提供了一个很好的示例来概述如何使用 Oracle 分层查询。我试图使用链接中给出的示例表tab1
生成以下数据组合,但持续了一段时间。使用 Oracle 版本 12.2
PARENT_ID CHILD_ID
-------- ---------
1 2 # the root node and id combination (This is evident by using ROOT_ID,ID)
1 3
1 4
. .
. .
2 5 # How to generate below combination in a select statement ont TAB1 table.
2 6
. .
. .
9 11
SELECT id,
parent_id,
RPAD('.', (level-1)*2, '.') || id AS tree,
level,
CONNECT_BY_ROOT id AS root_id,
LTRIM(SYS_CONNECT_BY_PATH(id, '-'), '-') AS path,
CONNECT_BY_ISLEAF AS leaf
FROM tab1
START WITH parent_id IS NULL
CONNECT BY parent_id = PRIOR id
ORDER SIBLINGS BY id;
上述select语句的输出
ID PARENT_ID TREE LEVEL ROOT_ID PATH LEAF
---------- ---------- -------------------- ---------- ---------- -------------------- ----------
1 1 1 1 1 0
2 1 ..2 2 1 1-2 0
3 2 ....3 3 1 1-2-3 1
4 2 ....4 3 1 1-2-4 0
5 4 ......5 4 1 1-2-4-5 1
6 4 ......6 4 1 1-2-4-6 1
7 1 ..7 2 1 1-7 0
8 7 ....8 3 1 1-7-8 1
9 1 ..9 2 1 1-9 0
10 9 ....10 3 1 1-9-10 0
11 10 ......11 4 1 1-9-10-11 1
12 9 ....12 3 1 1-9-12 1
图表:
【问题讨论】:
您遇到了什么问题? 试图在 tab1 表上找出一条选择语句,该语句将给出路径组合中显示的所有组合(父子)的输出,如 2-5,2-6 和 9-11。 我想你的问题已经在这里回答了***.com/questions/38461843/…你能检查一下吗? 该案例似乎没有回答如何获取2-5,2-6和9-11等节点的部分。这就像在图中找到所有可能的子节点和父节点组合一样。 感谢@KoenLostrie 指出问题。通过对那里给出的答案进行一些调整,我可以获得所需的结果。 【参考方案1】:获取所需输出的 sql 查询如下:
解决方案 1:使用 CTE
with h ( id, parent_id ) as (
select id ,parent_id from tab1
),
r ( id , parent_id, steps ) as (
select id , id , 0
from h
union all
select r.id, h.parent_id, steps + 1
from h join r
on h.id = r.parent_id
)
select parent_id, id
from r
where parent_id != id
order by parent_id asc;
解决方案 2:使用 Oracle 仅通过查询连接。 CONNECT BY NOCYCLE 子句可用于不遍历循环层次结构(如果有)。
with hier_data as
(
select
connect_by_root id as parent_id
,id
from tab1
connect by parent_id = prior id
order by parent_id,id
)
select * from hier_data
where
parent_id != id;
【讨论】:
以上是关于Oracle分层查询数据的主要内容,如果未能解决你的问题,请参考以下文章