Sql 创建具有特定结构的部门视图

Sql 创建具有特定结构的部门视图,sql,oracle,Sql,Oracle,我有一个具有以下部门结构的Oracle表: cddepartment - NUMBER - unique numeric identifier for department iddepartment - VARCHAR - unique string identifier for department nmdepartment - VARCHAR - name of department cddeptowner - NUMBER - numeric identifier of departmen

我有一个具有以下部门结构的Oracle表:

cddepartment - NUMBER - unique numeric identifier for department
iddepartment - VARCHAR - unique string identifier for department
nmdepartment - VARCHAR - name of department
cddeptowner - NUMBER - numeric identifier of department's parent (higher level)
以可视形式显示的部门名称树如下所示:

DIRECCIÓN 1
----GERENCIA 1
--------SUBGERENCIA 1
------------JEFATURA 1
DIRECCION 2
----GERENCIA 2
--------SUBGERENCIA 2
------------JEFATURA 2
GERENCIA 3
----SUBGERENCIA 3
--------JEFATURA 3
GERENCIA 4
----SUBGERENCIA 4
DIRECCIÓN 5
----SUBGERENCIA 5
--------JEFATURA 5
...
...
DIRECCIÓN N
----GERENCIA N
--------SUBGERENCIA N
------------JEFATURA N
所有的子树不一定有相同的精确结构。其中一些可以是DIRECCION-GERENCIA-SUBGERENCIA-JEFATURA。其中一些可以是GERENCIA-SUBGERENCIA-JEFATURA,一些DIRECCION-SUBGERENCIA-JEFATURA,以及四个基本单元的近10种不同组合:DIRECCIÓN、GERENCIA、SUBGERENCIA和JEFATURA

子树上下文中唯一固定的规则是DIRECCION总是比GERENCIA高,GERENCIA总是比SUBGERENCIA高,SUBGERENCIA总是比JEFATURA高。子树可以由两个、三个或四个基本单元组成

因此,我需要创建一个视图(在Oracle中),其中有五个固定列,如下图所示。目标是从SQL报告中轻松查询部门的DIRECCION、GERENCIA、SUBGERENCIA和/或JEFATURA

DEPARTMENT----DIRECCION----GERENCIA----SUBGERENCIA----JEFATURA
--------------------------------------------------------------------------
JEFATURA 1    DIRECCIÓN 1  GERENCIA 1  SUBGERENCIA 1  JEFATURA 1
SUBGERENCIA 1 DIRECCIÓN 1  GERENCIA 1  SUBGERENCIA 1
GERENCIA 1    DIRECCIÓN 1  GERENCIA 1
DIRECCIÓN 1   DIRECCIÓN 1
JEFATURA 2    DIRECCIÓN 2  GERENCIA 2  SUBGERENCIA 2  JEFATURA 2
SUBGERENCIA 2 DIRECCIÓN 2  GERENCIA 2  SUBGERENCIA 2
GERENCIA 2    DIRECCIÓN 2  GERENCIA 2
DIRECCIÓN 2   DIRECCIÓN 2
JEFATURA 3                 GERENCIA 3  SUBGERENCIA 3  JEFATURA 3
SUBGERENCIA 3              GERENCIA 3  SUBGERENCIA 3
GERENCIA 3                 GERENCIA 3
SUBGERENCIA 4              GERENCIA 4  SUBGERENCIA 4
GERENCIA 4                 GERENCIA 4
JEFATURA 5   DIRECCIÓN 5               SUBGERENCIA 5  JEFATURA 5
SUBGERENCIA5 DIRECCIÓN 5               SUBGERENCIA 5
DIRECCIÓN 5  DIRECCIÓN 5
...
...
JEFATURA N    DIRECCIÓN N  GERENCIA N  SUBGERENCIA N  JEFATURA N
SUBGERENCIA N DIRECCIÓN N  GERENCIA N  SUBGERENCIA N
GERENCIA N    DIRECCIÓN N  GERENCIA N
DIRECCIÓN N   DIRECCIÓN N

我很感激任何关于我如何做到这一点的线索。提前谢谢

看看分层查询(例如or)。 假设您创建一个表,如下所示:

create table dgsj -- dgsj: DIRECCION, GERENCIA, SUBGERENCIA, JEFATURA
as
select 1 cddepartment, 'DIRECCION_1' nmdepartment, NULL cddeptowner from dual union all
select 2, 'GERENCIA_1',    1 from dual union all
select 3, 'SUBGERENCIA_1', 2  from dual union all
select 4, 'JEFATURA_1',    3  from dual union all
select 5, 'DIRECCION_2',   NULL from dual union all
select 6, 'GERENCIA_2',    5 from dual union all
select 7, 'SUBGERENCIA_2', 6  from dual union all
select 8, 'JEFATURA_2',    7  from dual union all
select 9, 'GERENCIA_3',    NULL from dual union all
select 10, 'SUBGERENCIA_3', 9  from dual union all
select 11, 'JEFATURA_3',    10  from dual union all
select 12, 'GERENCIA_4',    NULL from dual union all
select 13, 'SUBGERENCIA_4', 12  from dual union all
select 14, 'DIRECCION_5',    NULL from dual union all
select 15, 'SUBGERENCIA_5', 14  from dual union all
select 16, 'JEFATURA_5',    15  from dual ;
易于阅读:

select * from dgsj;

CDDEPARTMENT  NMDEPARTMENT   CDDEPTOWNER  
1             DIRECCION_1    NULL         
2             GERENCIA_1     1            
3             SUBGERENCIA_1  2            
4             JEFATURA_1     3            
5             DIRECCION_2    NULL         
6             GERENCIA_2     5            
7             SUBGERENCIA_2  6            
8             JEFATURA_2     7            
9             GERENCIA_3     NULL         
10            SUBGERENCIA_3  9            
11            JEFATURA_3     10           
12            GERENCIA_4     NULL         
13            SUBGERENCIA_4  12           
14            DIRECCION_5    NULL         
15            SUBGERENCIA_5  14           
16            JEFATURA_5     15 
质疑

下面的查询返回表示层次结构的所有部门名称和“路径”,以及ID、级别和父ID

select 
  cddepartment as id
, nmdepartment
, sys_connect_by_path( nmdepartment, '/' ) full_path
, level as lvl
, case 
   when cddeptowner is null then '-' 
   else to_char( cddeptowner )
  end parent
from dgsj
start with cddeptowner is null
connect by cddeptowner = prior cddepartment 
order by level, cddeptowner, cddepartment ;

-- result
ID  NMDEPARTMENT   FULL_PATH                                         LVL  PARENT  
1   DIRECCION_1    /DIRECCION_1                                      1    -       
5   DIRECCION_2    /DIRECCION_2                                      1    -       
9   GERENCIA_3     /GERENCIA_3                                       1    -       
12  GERENCIA_4     /GERENCIA_4                                       1    -       
14  DIRECCION_5    /DIRECCION_5                                      1    -       
2   GERENCIA_1     /DIRECCION_1/GERENCIA_1                           2    1       
6   GERENCIA_2     /DIRECCION_2/GERENCIA_2                           2    5       
10  SUBGERENCIA_3  /GERENCIA_3/SUBGERENCIA_3                         2    9       
13  SUBGERENCIA_4  /GERENCIA_4/SUBGERENCIA_4                         2    12      
15  SUBGERENCIA_5  /DIRECCION_5/SUBGERENCIA_5                        2    14      
3   SUBGERENCIA_1  /DIRECCION_1/GERENCIA_1/SUBGERENCIA_1             3    2       
7   SUBGERENCIA_2  /DIRECCION_2/GERENCIA_2/SUBGERENCIA_2             3    6       
11  JEFATURA_3     /GERENCIA_3/SUBGERENCIA_3/JEFATURA_3              3    10      
16  JEFATURA_5     /DIRECCION_5/SUBGERENCIA_5/JEFATURA_5             3    15      
4   JEFATURA_1     /DIRECCION_1/GERENCIA_1/SUBGERENCIA_1/JEFATURA_1  4    3       
8   JEFATURA_2     /DIRECCION_2/GERENCIA_2/SUBGERENCIA_2/JEFATURA_2  4    7  
根据您的要求,这可能需要一些调整。 使用Oracle 12c和Oracle 11g()进行了测试

更新(使用@David Faber的方法将完整路径拆分为4列)

结果

NMDEPARTMENT   DIRECCION    GERENCIA    SUBGERENCIA    JEFATURA    
DIRECCION_1    DIRECCION_1  -           -              -           
DIRECCION_2    DIRECCION_2  -           -              -           
GERENCIA_3     -            GERENCIA_3  -              -           
GERENCIA_4     -            GERENCIA_4  -              -           
DIRECCION_5    DIRECCION_5  -           -              -           
GERENCIA_1     DIRECCION_1  GERENCIA_1  -              -           
GERENCIA_2     DIRECCION_2  GERENCIA_2  -              -           
SUBGERENCIA_3  -            GERENCIA_3  SUBGERENCIA_3  -           
SUBGERENCIA_4  -            GERENCIA_4  SUBGERENCIA_4  -           
SUBGERENCIA_5  DIRECCION_5  -           SUBGERENCIA_5  -           
SUBGERENCIA_1  DIRECCION_1  GERENCIA_1  SUBGERENCIA_1  -           
SUBGERENCIA_2  DIRECCION_2  GERENCIA_2  SUBGERENCIA_2  -           
JEFATURA_3     -            GERENCIA_3  SUBGERENCIA_3  JEFATURA_3  
JEFATURA_5     DIRECCION_5  -           SUBGERENCIA_5  JEFATURA_5  
JEFATURA_1     DIRECCION_1  GERENCIA_1  SUBGERENCIA_1  JEFATURA_1  
JEFATURA_2     DIRECCION_2  GERENCIA_2  SUBGERENCIA_2  JEFATURA_2 

DBFIDLE.

请将原始表格数据和预期结果显示为格式化文本,而不是图像。这听起来像是一个基本的分层查询加上pivot,但很难说。@Andrew8902,您如何知道给定部门的级别或上下文(例如DIRRECCION、GERENCIA等)?没有这些知识,我看不出你是如何做到这一点的。@Alex Poole@Davidaber给定部门的级别是可变的。唯一固定的两条规则是:1)DIRECCION的级别始终高于GERENCIA,GERENCIA的级别高于SUBGERENCIA,SUBGERENCIA的级别高于JEFATURA(因此我想我必须检查一个部门的名称,以确定它是否为DIRECCION,GERENCIA,SUBGERENCIA O JEFATURA)。子树可以由两个、三个或四个基本单元组成。我所说的“基本单位”是指迪雷西翁、格伦西亚、苏伯格伦西亚和杰法图拉。谢谢。有没有办法将FULL_PATH列拆分为四个不同的列?您可以尝试类似于
TRIM(“/”来自REGEXP_SUBSTR(FULL_PATH,“/DIRECCION\u\d+”))的方法作为DIRECCION
,等等。我建议在regex中包含正斜杠;否则,
GERENCIA\ud+
可能会匹配值
SUBGERENCIA\u1
,等等@stefan非常感谢!它非常有用!
NMDEPARTMENT   DIRECCION    GERENCIA    SUBGERENCIA    JEFATURA    
DIRECCION_1    DIRECCION_1  -           -              -           
DIRECCION_2    DIRECCION_2  -           -              -           
GERENCIA_3     -            GERENCIA_3  -              -           
GERENCIA_4     -            GERENCIA_4  -              -           
DIRECCION_5    DIRECCION_5  -           -              -           
GERENCIA_1     DIRECCION_1  GERENCIA_1  -              -           
GERENCIA_2     DIRECCION_2  GERENCIA_2  -              -           
SUBGERENCIA_3  -            GERENCIA_3  SUBGERENCIA_3  -           
SUBGERENCIA_4  -            GERENCIA_4  SUBGERENCIA_4  -           
SUBGERENCIA_5  DIRECCION_5  -           SUBGERENCIA_5  -           
SUBGERENCIA_1  DIRECCION_1  GERENCIA_1  SUBGERENCIA_1  -           
SUBGERENCIA_2  DIRECCION_2  GERENCIA_2  SUBGERENCIA_2  -           
JEFATURA_3     -            GERENCIA_3  SUBGERENCIA_3  JEFATURA_3  
JEFATURA_5     DIRECCION_5  -           SUBGERENCIA_5  JEFATURA_5  
JEFATURA_1     DIRECCION_1  GERENCIA_1  SUBGERENCIA_1  JEFATURA_1  
JEFATURA_2     DIRECCION_2  GERENCIA_2  SUBGERENCIA_2  JEFATURA_2