Sql server 获取所有帖子及其下属帖子
我希望你能帮助我。我正在使用SQL Server 2016,并试图生成一些代码来返回所有帖子及其所有下属帖子 到目前为止,我所掌握的代码如下: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
;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使用层次结构,请参阅本文描述如何创建这种层次结构表