2016-09-24 78 views
1

我有一个父子关系中有行的表。最大亲子关系深度为3.使用连接的单独列

一位家长只有一个孩子。

表定义 -

CREATE TABLE USERS { 
    empid NUMBER, 
    name VARCHAR2, 
    department VARCHAR2(20), 
    oldempid NUMBER, 
} 

数据 -

EMPID NAME DEPARTMENT OLDEMPID 
    1 FOO   IT  2 
    2 null   HR  4 
    3 BAR  ADMIN  null 
    4 null  DESIGN  null 

希望的输出 -

EMPID NAME DEPARTMENT_1 DEPARTMENT_2 DEPARTMENT_3 
    1 FOO   IT   HR  DESIGN 
    3 BAR  ADMIN   null   null 

全部所需的输出 -

EMPID NAME DEPARTMENT_1 DEPARTMENT_2 DEPARTMENT_3 OLDEMPID_1 OLDEMPID_2 
    1 FOO   IT   HR  DESIGN   2   4 
    3 BAR  ADMIN   null   null  null  null 

我已经尝试使用CONNECT BY PRIOR

SELECT CONNECT_BY_ROOT EMPID, 
     NAME, 
     RTRIM(LTRIM(SYS_CONNECT_BY_PATH(DEPARTMENT, '-'), '-'), '-') AS DEPARTMENT, 
     RTRIM(LTRIM(SYS_CONNECT_BY_PATH(OLDEMPID, '-'), '-'), '-') AS OLDEMPID 
    FROM USERS 
    WHERE CONNECT_BY_ISLEAF = 1 
    CONNECT BY PRIOR OLDEMPID = EMPID; 

我得到的输出 -

EMPID NAME DEPARTMENT  OLDEMPID 
    1 null IT-HR-DESIGN 1-2-4 
    3 BAR ADMIN    null 

回答

2

您还需要转动你的结果。你可以手工做到这一点,或者你可以使用PIVOT操作(因为你用oracle11g标签 - PIVOT变得可用的第一个版本)。子查询(在FROM子句中结束)是“连接方式”的分层查询。

with 
    users (EMPID, NAME, DEPARTMENT, OLDEMPID) as (
     select 1, 'FOO', 'IT' , 2 from dual union all 
     select 2, null , 'HR' , 4 from dual union all 
     select 3, 'BAR', 'ADMIN' , null from dual union all 
     select 4, null, 'DESIGN', null from dual 
    ), 
    tops (empid) as ( 
     select empid from users minus 
     select oldempid from users 
    ) 
select cbr_empid as empid, cbr_name as name, 
     "1_DEPARTMENT" as department_1, "2_DEPARTMENT" as department_2, 
     "3_DEPARTMENT" as department_3, "2_EMPID" as oldempid_2, "3_EMPID" as oldempid_3 
from (
     select empid, department, level as lvl, 
       connect_by_root(empid) as cbr_empid, connect_by_root(name) as cbr_name 
     from users 
     connect by prior oldempid = empid 
     start with empid in (select empid from tops) 
    ) 
pivot (max(department) as department, max(empid) as empid for lvl in (1, 2, 3)) 
; 

OUTPUT:

 EMPID NAME DEPARTMENT_1 DEPARTMENT_2 DEPARTMENT_3 OLDEMPID_2 OLDEMPID_3 
---------- ---- ------------ ------------ ------------ ---------- ---------- 
     1 FOO IT   HR   DESIGN    2   4 
     3 BAR ADMIN          
+0

谢谢。但是,我仍然遇到员工姓名的问题。我编辑了这个问题。你能看看吗? – JHS

+0

你对“名字”的处理正是我对“empid”所做的。我更新了答案以包含NAME。 – mathguy

相关问题