2017-02-22 5 views
0

Надеюсь, вы можете мне помочь. Я использую 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 

То, что я хочу для Поста «генеральный директор», чтобы показать все почтовые номера, то «Директор по развитию», чтобы показать все почтовые номера для всех сообщений ниже их в иерархии и т. д.

Буду признателен за любую помощь.

+0

Вы можете просто показать, что именно вы хотите и какие у вас есть таблицы, а также связь между таблицами? –

+0

Для этого упражнения я использую только таблицу [Structure]. [Post]. У каждой Почты есть [Номер Авторизованного Пользователя], который разрешает отпуск и т. Д. Мне нужно видеть, какие сообщения, прямо или косвенно, управляют другими сообщениями. Таким образом, CEO управляет всеми должностями в организационной структуре, но Директор по развитию управляет только сообщениями ниже его в иерархии. – Peter

+0

которые являются первичным ключом в этих таблицах? а также структуру таблицы? –

ответ

0

Вы находитесь на хорошем пути. Теперь с помощью CTE вы можете создать SUBSELECT с каждым почтовым подчинением и выполнить их, т. Е. их с FOR 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 
+0

Извините, это покажет только прямых подчиненных. Полагаю, вам нужно отобразить все подчиненные на другом уровне. В этом случае SQL Server 2016 использует иерархию, см. Https://msdn.microsoft.com/en-us/library/bb677173.aspx В этом сообщении описано, как создать такую ​​иерархическую таблицу https://msdn.microsoft.com/ ан-нас/библиотека/bb677237.aspx – sqlady

0

Я считаю, что нашел ответ. Это возвращает именно то, что мне нужно. Типично, что я получаю ответ вскоре после публикации вопроса.

;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] 

Спасибо всем, кто нашел время, чтобы посмотреть на это для меня.

0

Это было интересное мероприятие. Вы хотите посмотреть мое решение? Вы можете получить список иерархии или ее ветку. Это необходимо только для изменения условий в предложении 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 
Смежные вопросы