Oracle - 多列分层查询

时间:2021-03-20 00:54:12

标签: sql oracle

我刚刚开始学习分层查询来解决问题。大多数可用示例都基于存在特定父级且您可以使用prior 连接到它的条件。

但是,我有一个如下所示的表结构,其中 A 列是 B 列的父级,B 列是 C 列的父级。

<头>
Column_A Column_B Column_C
SaaS 一朵云 测试 1
SaaS 一朵云 测试 2
SaaS 一朵云 测试 3
SaaS B 云 测试 1
SaaS B 云 测试 2
SaaS C 云 测试 1

基于上表,我想看看是否有任何技术可以实现以下结果。

SaaS(顶级)

  • 一朵云(2 级)

    • 测试 1(级别 3)
    • 测试 2
    • 测试 3
  • B 云

    • 测试 1
    • 测试 2
  • C 云

由于多列并且没有指定的方法将 Column_A 标识为不同的父项,我无法使用开头。

CREATE TABLE TAB1 (COLUMN_A,COLUMN_B,COLUMN_C) AS
SELECT 'SaaS','A Cloud','Test 1' FROM DUAL
UNION ALL
SELECT 'SaaS','A Cloud','Test 2' FROM DUAL
UNION ALL
SELECT 'SaaS','A Cloud','Test 3' FROM DUAL
UNION ALL
SELECT 'SaaS','B Cloud','Test 1' FROM DUAL
UNION ALL
SELECT 'SaaS','B Cloud','Test 2' FROM DUAL
UNION ALL
SELECT 'SaaS','C Cloud','Test 1' FROM DUAL


select TAB1.*,LEVEL from TAB1
START WITH COLUMN_A='SaaS'
connect by prior  COLUMN_B = COLUMN_A AND COLUMN_C= COLUMN_B



关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:1)

这是您要找的吗:

with newTab (ParentCol,ChildCol) as (
select distinct  null  ParentCol, Column_A ChildCol from Tab1 where Column_A='SaaS'
union all
select distinct Column_A ParentCol,Column_B ChildCol from Tab1
union all
select distinct Column_B,Column_C from Tab1),
cte (ParentCol,ChildCol,lvl) as (
select ParentCol, ChildCol , 1 as lvl from newTab where ParentCol is null
union all 
select  nt.ParentCol, nt.ChildCol , (cte.lvl+ 1) as lvl from  newTab nt inner join cte on nt.ParentCol=cte.ChildCol)
select * from cte 

输出:

|PARENTCOL|CHILDCOL|LVL|
| -       |SaaS    |1  |
|SaaS     |A Cloud |2  |
|SaaS     |C Cloud |2  |
|SaaS     |B Cloud |2  |
|A Cloud  |Test 3  |3  |
|A Cloud  |Test 2  |3  |
|A Cloud  |Test 1  |3  |
|C Cloud  |Test 1  |3  |
|B Cloud  |Test 1  |3  |
|B Cloud  |Test 2  |3  |
相关问题