员工经理报告-Sql Server

员工经理报告-Sql Server,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我有下表 empid empname managerID 1 A NULL 2 B 1 3 C 1 4 D 2 ddl如下所示 Declare @t table(empid int, empname varchar(20), managerID int) insert into @t select 1,'A',null union

我有下表

empid   empname     managerID
1          A          NULL
2          B           1
3          C           1
4          D           2
ddl如下所示

Declare @t table(empid int, empname varchar(20), managerID int)
insert into @t 

select 1,'A',null union all
select 2,'B',1 union all
select 3,'C',1 union all 
select 4,'D',2
我要做的是准备一份报告,说明哪些员工向哪个经理汇报

我已经用溶剂溶解了它

select EmpName = e.empname, ManagerName = m.empname
from @t e 
left join
@t m
on  e.managerID = m.empid  
所需的输出为

EmpName    ManagerName
A          NULL
B          A
C          A
D          B

还有哪些方法可以这样做?

我认为您的解决方案最合适,但我们可以重写它,例如:

select t1.empname [EmpName]
    , (select t2.empname from @t t2 where t2.empid = t1.managerID) [ManagerName]
from @t t1
自动加入表格

案例1:拥有经理的所有员工

select e1.empname employee, e2.empname manager
from employee e1
join employee e2 on e1.managerId = e2.empid
order by e2.name,e1.name
案例2:是否有经理的所有员工

select e1.empname employee, COALESCE(e2.empname,'none') manager
from employee e1
left join employee e2 on e1.managerId = e2.empid
order by e2.name,e1.name

好的,所以你问了其他的方法。这有点奇怪

CREATE TABLE employee (empid int, empname varchar(20), managerID int)
GO
insert into employee 

select 1,'A',null union all
select 2,'B',1 union all
select 3,'C',1 union all 
select 4,'D',2
GO

CREATE FUNCTION [dbo].[GetEmployeeTree](@ManagerId int)
RETURNS XML
WITH RETURNS NULL ON NULL INPUT 
BEGIN RETURN 
  (SELECT   empID as '@Id', 
            empname AS '@Name',
            dbo.GetEmployeeTree(empid) 
   FROM employee em
   WHERE ManagerId=@ManagerId
   FOR XML PATH('Employee'), TYPE)
END

GO
SELECT  empID as '@Id', 
        empname AS '@Name',
        dbo.GetEmployeeTree(empId) 
FROM employee
WHERE managerId is null
FOR XML PATH('Employee'), ROOT('Employees')
这就产生了这个输出

<Employees>
  <Employee Id="1" Name="A">
    <Employee Id="2" Name="B">
      <Employee Id="4" Name="D" />
    </Employee>
    <Employee Id="3" Name="C" />
  </Employee>
</Employees>

实际上,我已经使用它生成了包含上万个节点的大型XML树,而且速度非常快。可能有一种方法可以将根查询与子查询合并,我只是还没有完全弄清楚。当我在过去使用这种技术时,我使用了一个单独的链接和节点表来定义层次结构,这样做时它会更干净。

正确的结果,但一般来说,您应该在选择中加入并避免子查询possible@niktrs,我同意。为了OP的目的,我写了关于最佳解决方案的意见。它产生了错误的结果。使用外部联接而不是内部联接。你的查询和OP的有什么区别?我以为你只想要有经理的员工。我写了两个选项我不是主题启动者:-我只是猜测。@polishchuk你的评论很好,所以我认为最好提供两个案例,让@aditi决定什么对他更好我同意你的看法,没关系:-这有点奇怪。-你一定会让我失望的,我的朋友:。你好,我用了一个非常相似的脚本来实现我想做的事情,它对我公司的大多数经理都有效,但我遇到了两个经理,他们都要互相汇报,因此当我为那些特定的经理运行时,我得到了100次最大递归错误。。。有没有办法避免这种情况?
<Employees>
  <Employee Id="1" Name="A">
    <Employee Id="2" Name="B">
      <Employee Id="4" Name="D" />
    </Employee>
    <Employee Id="3" Name="C" />
  </Employee>
</Employees>