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


