Oracle分层查询

时间:2010-01-25 15:05:15

标签: plsql oracle10g hierarchy hierarchical-data

我有一个包含公司层次结构的表。决定使用这个平台,因为公司没有明确的级别数。该表运行良好,如果您在客户端使用级联列表,那就完美了。但是,我需要看一个“部分”,以及它拥有的所有其他“部分”。希望下面的信息能让您了解我需要做些什么。

表格默认

create table SECTION
(
  SECTION_ID       NUMBER(38) not null,
  SECTION_NAME     VARCHAR2(75) not null,
  SECTION_MANAGER  NUMBER(6) not null,
  SECTION_LEVEL    NUMBER(3) not null,
  OWNER_SECTION_ID NUMBER(38)
)

数据

1   IT                    901763    2   0
2   Business Systems             904241 3   1
3   Business Analysis            900813 4   2
4   Development          900976 4   2
5   Testing                   907052    4   2
6   Systems Architecture    908012  4   2
7   Mobilisation             904241 4   2
8   Operations           900885 2   0
9   Area 2                    900456    3   8
0   Executive                          1    0   0

我需要看到的内容

0   Executive                          1    8   Operations
0   Executive                          1    1   IT
0   Executive                          1    0   Executive
0   Executive                          1    2   Business Systems
0   Executive                          1    7   Mobilisation
0   Executive                          1    6   Systems Architecture
0   Executive                          1    4   Development
0   Executive                          1    3   Business Analysis
0   Executive                          1    5   Testing
0   Executive                          1    9    Area 2
1   IT                    901763    2   Business Systems
1   IT                    901763    7   Mobilisation
1   IT                    901763    6   Systems Architecture
1   IT                    901763    4   Development
1   IT                    901763    3   Business Analysis
1   IT                    901763    5   Testing
2   Business Systems             904241 7   Mobilisation
2   Business Systems             904241 6   Systems Architecture
2   Business Systems             904241 4   Development
2   Business Systems             904241 3   Business Analysis
2   Business Systems             904241 5   Testing
8   Operations           900885 9    Area 2
7   Mobilisation             904241     
6   Systems Architecture    908012      
4   Development          900976     
3   Business Analysis            900813     
5   Testing                   907052        
9    Area 2                   900456

我可以在客户端的C#中执行此操作,但我真的希望将其作为数据库的视图。

请有人帮我解决这个问题。它甚至可能吗?

如果您需要澄清任何内容,请发表评论,我会尝试提供更多信息。

2 个答案:

答案 0 :(得分:3)

此解决方案产生的结果类似于问题规范中的结果。

select
    connect_by_root section_id section_id,
    connect_by_root section_name section_name,
    connect_by_root section_manager section_manager,
    section_id subsection_id,
    section_name subsection_name
from
    section
connect by nocycle
    prior section_id = owner_section_id

请求的解决方案在针对样本数据执行时生成28行。

请注意,在示例结果中,Executive显示为自身的子部分,而ITBusiness SystemsOperations(与Executive相似,还有其他小节)不要。此解决方案会产生另外3行。

此外,请注意Executive是其自己的所有者。我相信不应该在图表中允许循环,除非他们向我们揭示的邪恶是实现某些所需功能的最合理方式。如果图表中没有此类循环,则应删除查询中的nocycle关键字。

答案 1 :(得分:1)

是的,有可能。您需要使用Oracle CONNECT BY语法。 Refer here。很抱歉没有共享SQL,因为我自己无法检查它。