Sql server MS SQL服务器:创建管理层次结构:连接多个表的问题

Sql server MS SQL服务器:创建管理层次结构:连接多个表的问题,sql-server,left-join,Sql Server,Left Join,我必须创建一个报告,显示组织中的监督关系层次结构。有许多不同的方法可以建立一条监督线。下面是其中的一些 Vice President-Associate VP-Director-Assistant Director-Supervisor-worker Vice President-Associate VP-Director-Supervisor - worker Vice President-Director-Assistant Director-Supervisor-worker Vice P

我必须创建一个报告,显示组织中的监督关系层次结构。有许多不同的方法可以建立一条监督线。下面是其中的一些

Vice President-Associate VP-Director-Assistant Director-Supervisor-worker
Vice President-Associate VP-Director-Supervisor - worker
Vice President-Director-Assistant Director-Supervisor-worker
Vice President-Director-worker
Vice President-Director-Director B-Worker
Vice President-Director-Director B-Supervisor->Worker
Vice President-Associate VP-worker
Vice President-worker
Vice President-Director-Assistant Director
Vice President-Director-worker
这是层次结构中每个角色的表;VP表、AVP表、Director表等等。如果层次结构行不包含特定角色,则该值应返回null。我编写了这个程序,所以我从Worker表开始,然后离开并从那里连接所有表。我已尝试将所有可能的连接因素考虑在内,请参见下面的程序。我正在使用不同的连接组合使用Supervisor\u Position\u NBR=Position\u NBR有许多不同的方式,这些线看起来就像后面的一个小示例:

副总裁副总裁副总裁董事B助理董事主管工人 ============== ============ ======== ========== ================== ========== ====== 简·史密斯·乔·罗伯茨马西·詹姆斯零号詹姆斯·马尔·马特·G 简·史密斯·乔·罗伯茨·玛西·詹姆斯·零号詹姆斯·马尔·杰斯·D Jane Smith Joe Roberts Marcy James Null Frank jay Carol R Jane Smith Null Marty Bob Null Sonja Null Sam Smith Jane Smith Null Marty Bob Null Sonja Null Nate lowe 简·史密斯零拉尔夫·科尔零

我的两个问题是:

当我有一条主管线,其中包括副总裁、主管和员工,但主管和员工都直接向副总裁报告时,当运行查询时,主管会退出,只有员工会出现。因此: 副总裁副总裁副总裁主任主任B助理主任主管工人 ============== =========== ======= ========== ================= ========= ======= Jane Smith空空空MarcyJames空空空

我应该在什么时候带回这个:

副总裁副总裁副总裁主任主任B助理主任主管工人 ============= =========== ======== ========== ======== ======= ========= ===== 简·史密斯零马克西·詹姆斯零 简·史密斯零乔·罗伯茨零零

有没有更干净更有效的方法来编写此查询? 非常感谢您的帮助

select
    vp.Vice_President,
    avp.Associate_VP,  
    d.director, 
    db.director_B,
    ad.Assistant_Director,
    s.Supervisor,
    w.worker
    from gw_ppp.dbo.vw_worker w 
    left join gw_ppp.dbo.vw_Manager_Sup_Role s 
    on w.Supervisor_Position_NBR=s.POSITION_NBR
    left join gw_ppp.dbo.vw_ADIR_Role AD 
    on w.Supervisor_Position_NBR=AD.POSITION_NBR
    or s.Supervisor_Position_NBR=AD.POSITION_NBR
    left join gw_ppp.dbo.vw_Dir_Role_B db 
    on w.Supervisor_Position_NBR=db.POSITION_NBR
    or s.Supervisor_Position_NBR=db.POSITION_NBR
    or AD.Supervisor_Position_NBR=db.POSITION_NBR
    left join gw_ppp.dbo.vw_Dir_Role D 
    on w.Supervisor_Position_NBR=D.POSITION_NBR
    or s.Supervisor_Position_NBR=D.POSITION_NBR
    or AD.Supervisor_Position_NBR=D.POSITION_NBR
    or db.Supervisor_Position_NBR=D.POSITION_NBR
    left join gw_ppp.dbo.vw_AVP_Role AVP 
    on w.Supervisor_Position_NBR=AVP.POSITION_NBR
    or s.Supervisor_Position_NBR=AVP.POSITION_NBR
    or AD.Supervisor_Position_NBR=AVP.POSITION_NBR
    or D.Supervisor_Position_NBR=AVP.POSITION_NBR
    left join  gw_ppp.dbo.vw_VP_Role VP 
    on w.Supervisor_Position_NBR=VP.POSITION_NBR
    or s.Supervisor_Position_NBR=vp.POSITION_NBR
    or ad.Supervisor_Position_NBR=vp.POSITION_NBR
    or d.Supervisor_Position_NBR=vp.POSITION_NBR
    or avp.Supervisor_Position_NBR=vp.POSITION_NBR
    order by w.worker
下面是我用来创建角色视图的程序


考虑一个常见的表表达式,如下所示

WITH org AS 
(
    SELECT 
        ee.POSITION_NBR, ee.EmpName, ee.Title
    FROM 
        employee AS ee
    UNION ALL 
    SELECT ee.POSITION_NBR, o.EmpName, o.Title
    FROM 
    employee AS ee 
    JOIN org o ON (o.POSITION_NBR = ee.SupervisorId)
)
从职位所在组织中选择*在职位所在员工中选择职位,职位为“工人”

对于每个员工,此递归CTE检索员工管理链中的所有员工

然后,您可以将其旋转,以获得所需的格式。缺少的管理级别将自动具有空值


请看一个完整的例子。为简洁起见,我只介绍了前三个管理级别,但您应该能够按照此模式添加其他级别。

请查看此帖子,谢谢。我没有更改/创建表的权限,因此它变得更具挑战性。我会把报纸通读一遍。你真的为每个角色准备了一张桌子吗?还是这些视图都访问同一个表?我假设位置是唯一的?所以我们不会看到一个助理导演与副总裁的职位相同?@HLGEM所有视图都访问同一个表。这太棒了!谢谢不过我有个问题。如果我有一句话,一个副总裁有一个主管和一个工人向他们汇报,但工人不在主管之下,直接向副总裁汇报,那该怎么办。请注意,William不向主管汇报,而是直接向董事汇报。查询仍然正确地显示它。
WITH org AS 
(
    SELECT 
        ee.POSITION_NBR, ee.EmpName, ee.Title
    FROM 
        employee AS ee
    UNION ALL 
    SELECT ee.POSITION_NBR, o.EmpName, o.Title
    FROM 
    employee AS ee 
    JOIN org o ON (o.POSITION_NBR = ee.SupervisorId)
)