Sql 创建具有特定结构的部门视图
我有一个具有以下部门结构的Oracle表: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
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