Self Referencing или Self-Join отношение как правильно сделать запрос?

Вот такая таблица

CREATE TABLE [dbo].[Employees] (
[Id]        INT           IDENTITY (1, 1) NOT NULL,
[Name]      NVARCHAR (50) NOT NULL,
[ManagerId] INT           NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Employees_Employees] FOREIGN KEY ([ManagerId]) REFERENCES [dbo].[Employees] ([Id])
);

Такой запрос

SELECT Id, Name, ManagerId
FROM dbo.Employees;

дает такой результат

результат первого запроса

Если сделать такой запрос

SELECT em.Id
     , em.Name  AS 'Manager'
     , m.Name
FROM dbo.Employees AS em
RIGHT JOIN dbo.Employees AS m
    ON em.Id = m.ManagerId
ORDER BY em.Id;

получаем так

результа второго запроса

Так вот пытаюсь перевернуть и сделать LEFT JOIN

SELECT em.Id
     , em.Name  
     , m.Name AS 'Manager'
FROM dbo.Employees AS em
LEFT JOIN dbo.Employees AS m
    ON em.Id = m.ManagerId
ORDER BY m.Id;

и получаю такое

результат последнего запроса

Как исправить и получить слева полный список сотрудников, а справа кто у них менеджер?


Ответы (1 шт):

Автор решения: Павел Овчинников

Если нужно получить только список сотрудников с менеджерами, а тех у кого нет менеджера не выводить, то вам нужно сделать вот такой запрос

SELECT em.Id
     , em.Name  
     , m.Name AS 'Manager'
FROM dbo.Employees AS em
JOIN dbo.Employees AS m
    ON em.Id = m.ManagerId
ORDER BY m.Id;

Если нужно получить весь список сотрудников и даже тех у кого нет менеджера, то ваш запрос с LEFT JOIN это сделает.

Если нужно получить всех менеджеров, даже тех у кого нет сотрудников (альтернатива правому соединению из вашего запроса с правым соединением), то запрос будет выглядеть так:

SELECT em.Id , em.Name , m.Name AS 'Manager' 
   FROM dbo.Employees AS m 
LEFT JOIN dbo.Employees AS em ON em.Id = m.ManagerId 
ORDER BY m.Id
→ Ссылка