Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取所有帖子及其下属帖子_Sql Server_Tsql_Sql Server 2016 - Fatal编程技术网

Sql server 获取所有帖子及其下属帖子

Sql server 获取所有帖子及其下属帖子,sql-server,tsql,sql-server-2016,Sql Server,Tsql,Sql Server 2016,我希望你能帮助我。我正在使用SQL Server 2016,并试图生成一些代码来返回所有帖子及其所有下属帖子 到目前为止,我所掌握的代码如下: ;WITH CTE AS ( SELECT P.[Post Number], P.[Authoriser Post Number], P.[Post Name] FROM Structure.Post P WHERE P.[Authoriser Post Number] IS NULL UNION ALL SELE

我希望你能帮助我。我正在使用SQL Server 2016,并试图生成一些代码来返回所有帖子及其所有下属帖子

到目前为止,我所掌握的代码如下:

;WITH CTE AS
(
SELECT
    P.[Post Number],
    P.[Authoriser Post Number],
    P.[Post Name]
FROM
    Structure.Post P
WHERE
    P.[Authoriser Post Number] IS NULL
UNION ALL
SELECT
    C.[Post Number],
    C.[Authoriser Post Number],
    C.[Post Name]
FROM
    Structure.Post C
JOIN
    CTE P ON C.[Authoriser Post Number] = P.[Post Number]
) SELECT * FROM CTE
结果:

[Post Number]   [Authoriser Post Number]    [Post Name]
85              NULL                        CEO
86              85                          Development Director
87              85                          Sales Director
88              85                          HR Director
89              88                          HR Manager
90              89                          HR Officer
91              89                          Recruitment Officer
92              89                          HR Assistant
93              87                          Sales Manager
94              87                          Sales Manager
97              94                          Salesman
98              94                          Sales Support Officer
95              93                          Salesman
96              93                          Sales Support Officer
99              86                          Web Design Manager
100             86                          SQL Manager
104             100                         Project Manager
105             100                         SQL Developer
101             99                          Web Developer
102             99                          C# Developer
103             99                          Project Manager
我想要的是,职位“CEO”显示所有职位编号,然后职位“开发总监”显示层次结构中低于他们的所有职位的所有职位编号,等等

我将非常感谢您的帮助。

您正在路上。 现在,使用CTE,您可以为每个职位的下属创建SUBSELECT,并用XML的

SELECT
   P.[Post Number],
   P.[Authoriser Post Number],
   P.[Post Name],
   (    
     SELECT 
            cte2.[Post name] + ', ' AS [text()] 
     FROM CTE cte2
     WHERE cte1.[Post Number] = cte2.[Post Number]
     ORDER BY cte2.[Post name] -- This is optional
     FOR XML PATH ('')
   ) [Subordinates]
FROM CTE cte1

我相信我已经找到了答案。这正是我需要的。典型的情况是,我在发布问题后很快就能得到答案

;WITH CTE AS
   (
   SELECT
          P.[Post Number],
          P.[Authoriser Post Number],
          P.[Post Name]
   FROM
          Structure.Post P
   UNION ALL
   SELECT
          C.[Post Number],
          P.[Authoriser Post Number],
          C.[Post Name]
   FROM
          Structure.Post C
   JOIN
          CTE P ON C.[Authoriser Post Number] = P.[Post Number]
   ) SELECT DISTINCT * FROM CTE WHERE [Authoriser Post Number] IS NOT NULLORDER BY [Authoriser Post Number]

谢谢大家花时间帮我看这个。

这是一个有趣的练习。你想看看我的解决方案吗? 您可以获取层次结构列表或某些it分支。它只需要更改WHERE子句中的条件

DECLARE @Structure TABLE
(
    [Post Number]   INT,
    [Authoriser Post Number]    INT,
    [Post Name] VARCHAR(32)
)

INSERT @Structure
VALUES
(85, NULL, 'CEO'),
(86, 85, 'Development Director'),
(87, 85, 'Sales Director'),
(88, 85, 'HR Director'),
(89, 88, 'HR Manager'),
(90, 89, 'HR Officer'),
(91, 89, 'Recruitment Officer'),
(92, 89, 'HR Assistant'),
(93, 87, 'Sales Manager'),
(94, 87, 'Sales Manager'),
(97, 94, 'Salesman'),
(98, 94, 'Sales Support Officer'),
(95, 93, 'Salesman'),
(96, 93, 'Sales Support Officer'),
(99, 86, 'Web Design Manager'),
(100, 86, 'SQL Manager'),
(104, 100, 'Project Manager'),
(105, 100, 'SQL Developer'),
(101, 99, 'Web Developer'),
(102, 99, 'C# Developer'),
(103, 99, 'Project Manager')

;WITH cte
AS
(
    SELECT  [Post Number], [Authoriser Post Number], [Post Name], 1 AS Num, CAST('/' + CAST([Post Number] AS VARCHAR) + '/' AS VARCHAR(4000)) AS Hierarchy
    from @Structure
    WHERE [Authoriser Post Number] IS NULL
    UNION ALL
    SELECT s.[Post Number], s.[Authoriser Post Number], s.[Post Name],
        p.Num + 1, CAST(Hierarchy + CAST(s.[Post Number] AS VARCHAR) + '/' AS VARCHAR(4000))
    from @Structure s
        JOIN cte p ON p.[Post Number] = s.[Authoriser Post Number]
)

SELECT c2.[Post Number], c2.[Authoriser Post Number], SPACE(c2.NUM*5) + c2.[Post Name] AS [Post Name]
FROM cte c1
    JOIN cte c2 ON (c2.Num > c1.Num AND c2.Hierarchy LIKE '%/' + CAST(c1.[Post Number] AS VARCHAR) + '/%') OR c2.[Post Number] = c1.[Post Number]
WHERE c1.[Post Name] = 'CEO'
ORDER BY c2.Hierarchy

你能告诉我你到底想要什么,你有什么表吗?还有表之间的联系吗?在这个练习中,我只使用[Structure].[Post]表。每个职位都有一个[授权人职位编号],即谁授权休假等。我需要了解哪些职位直接或间接管理哪些其他职位。因此,首席执行官管理组织结构中的所有职位,而发展总监只管理层级结构中他下面的职位。这些表中的主键是什么?还有表的结构?对不起,这只显示直接下属。我想您需要在其他级别显示所有子对象。在这种情况下,SQLServer2016使用层次结构,请参阅本文描述如何创建这种层次结构表