sql雇员表与串联的直接报告层次结构

pu82cl6c  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(271)

我有一个雇员表,其结构如下所示。我试图用逗号分隔的值构建一个列,这些值直接向员工报告。我用经理的名字很容易理解。实际数据具有ID。

EMPID     NAME     MANAGER_1     MANAGER_2     MANAGER_3     MANAGER_4.......     MANAGER_30
A3456     JOHN     MEGAN         DEREK         MIKE          NULL
S4593     ASHTON   MEGAN         DEREK         MIKE          NULL
G8394     MICHAEL  MEGAN         DEREK         MIKE          NULL
D9038     MIKE     MEGAN         DEREK         NULL
J4890     DEREK    MEGAN         NULL
M4940     MEGAN    NULL

层级结构如下:约翰的直接经理是迈克,迈克向德里克汇报,德里克向梅根汇报阿什顿的直接经理是迈克,迈克向德里克汇报,德里克向梅根汇报。
我正在尝试建立一个新的专栏,它将创建一个逗号分隔的直接报告列表,例如:对于迈克,直接报告将是约翰,阿什顿,迈克尔对于德里克,直接报告将是迈克
预期结果

EMPID     NAME     MANAGER_1     MANAGER_2     MANAGER_3     MANAGER_4.......     Direct Reports     
A3456     JOHN     MEGAN         DEREK         MIKE          NULL                 NULL          
S4593     ASHTON   MEGAN         DEREK         MIKE          NULL                 NULL          
G8394     MICHAEL  MEGAN         DEREK         MIKE          NULL                 NULL          
D9038     MIKE     MEGAN         DEREK         NULL                               JOHN, ASHTON, MICHAEL
J4890     DEREK    MEGAN         NULL                                             MIKE
M4940     MEGAN    NULL                                                           MEGAN

要在sql中构建它,我应该使用分区逻辑吗?

jk9hmnmh

jk9hmnmh1#

这很简单-只要使用coalesce:
此查询将为您提供所需的:

select 
   coalesce(MANAGER_30, MANAGER_29,...MANAGER_1) NAME
  ,listagg(name,',')within group(order by name) "Direct Reports"
grom your_table
group by 
   coalesce(MANAGER_30, MANAGER_29,...MANAGER_1)

您只需要将结果保留到原始查询。
但是这样的结构很不方便。我建议使用父->子关系的普通层次结构表

相关问题