SQL 服务器 - 自行加入
SQL Server - Self Join
我有一个table如下
EmployeeID Name ManagerID
2 David 3
3 Roger NULL
4 Marry 2
5 Joseph 2
7 Ben 2
这里 Roger 是高级经理
迈克和大卫是经理
其余都是员工
我正在寻找这样的输出:
EmployeeName ManagerName TopManager
Marry David Roger
Joseph David Roger
Ben David Roger
NULL David Roger
我试过像这样使用 Self Join:
SELECT e1.Name EmployeeName, ISNULL(e2.name, 'Top Manager') AS ManagerName
FROM Employee e1
LEFT JOIN Employee e2
ON e1.ManagerID = e2.EmployeeID
但它没有提供我正在寻找的输出。
如果您可以有不同的高层管理人员,则需要递归 CTE:
with cte as (
select employeeid, name, name as topmanager
from Employee
where managerid is null
union all
select t.employeeid, t.name, cte.topmanager
from Employee t join
cte
on t.managerid = cte.employeeid
)
select *
from cte;
如果只有一位高层管理人员,则:
select e.*, topm.name as topmanager
from employee e cross join
(select e2.* from employee e2 where e2.managerid is null) as topm
我认为您必须进行两次自连接才能获得所需的输出。
我以这种方式创建了查询并得到了你提到的输出。请注意,我没有包括具有空值的最后一行,其余保持不变。
查询:
create table Employees (EmployeeID int, Name varchar(10), ManagerID int)
Insert into Employees values
(2, 'David' , 3 )
,(3, 'Roger' , NULL)
,(4, 'Marry' , 2 )
,(5, 'Joseph' , 2 )
,(7, 'Ben' , 2 )
select e.name as EmployeeName, e1.name ManagerName, e2.Name TopManager
from Employees e
left join Employees e1 on e.ManagerID = e1.employeeid
left join Employees e2 on e1.ManagerID = e2.EmployeeID
where e.ManagerID is not null and e1.ManagerID is not null
Where 条件限制了 Employee 列中的经理姓名。
输出:
EmployeeName ManagerName TopManager
Marry David Roger
Joseph David Roger
Ben David Roger
我有一个table如下
EmployeeID Name ManagerID
2 David 3
3 Roger NULL
4 Marry 2
5 Joseph 2
7 Ben 2
这里 Roger 是高级经理 迈克和大卫是经理 其余都是员工
我正在寻找这样的输出:
EmployeeName ManagerName TopManager
Marry David Roger
Joseph David Roger
Ben David Roger
NULL David Roger
我试过像这样使用 Self Join:
SELECT e1.Name EmployeeName, ISNULL(e2.name, 'Top Manager') AS ManagerName
FROM Employee e1
LEFT JOIN Employee e2
ON e1.ManagerID = e2.EmployeeID
但它没有提供我正在寻找的输出。
如果您可以有不同的高层管理人员,则需要递归 CTE:
with cte as (
select employeeid, name, name as topmanager
from Employee
where managerid is null
union all
select t.employeeid, t.name, cte.topmanager
from Employee t join
cte
on t.managerid = cte.employeeid
)
select *
from cte;
如果只有一位高层管理人员,则:
select e.*, topm.name as topmanager
from employee e cross join
(select e2.* from employee e2 where e2.managerid is null) as topm
我认为您必须进行两次自连接才能获得所需的输出。
我以这种方式创建了查询并得到了你提到的输出。请注意,我没有包括具有空值的最后一行,其余保持不变。
查询:
create table Employees (EmployeeID int, Name varchar(10), ManagerID int)
Insert into Employees values
(2, 'David' , 3 )
,(3, 'Roger' , NULL)
,(4, 'Marry' , 2 )
,(5, 'Joseph' , 2 )
,(7, 'Ben' , 2 )
select e.name as EmployeeName, e1.name ManagerName, e2.Name TopManager
from Employees e
left join Employees e1 on e.ManagerID = e1.employeeid
left join Employees e2 on e1.ManagerID = e2.EmployeeID
where e.ManagerID is not null and e1.ManagerID is not null
Where 条件限制了 Employee 列中的经理姓名。
输出:
EmployeeName ManagerName TopManager
Marry David Roger
Joseph David Roger
Ben David Roger