2011-07-01 15 views
0

は、私は、以下の表に持って従業員マネージャーレポート - SQL Serverの

empid empname  managerID 
1   A   NULL 
2   B   1 
3   C   1 
4   D   2 

私は何を持っていることは、従業員がに報告を示します報告書を作成することです

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 

下のようDDLはありますどのマネージャー。

私は

select EmpName = e.empname, ManagerName = m.empname 
from @t e 
left join 
@t m 
on e.managerID = m.empid 

を使用してそれをsovedしており、所望の出力が

EmpName ManagerName 
A   NULL 
B   A 
C   A 
D   B 

そうすることの他の方法は何ですかいますか

答えて

0

例えば、私は、あなたのソリューションは、最も適切であると思うが、我々はそれを書き換えることができます:

select t1.empname [EmpName] 
    , (select t2.empname from @t t2 where t2.empid = t1.managerID) [ManagerName] 
from @t t1 
+0

正しい結果ですが、通常は可能な限りselectでサブクエリに参加して避けてください。 – niktrs

+0

@niktrs、私は同意します。私はOPの目的のための最善の解決策についての私の意見を書いた。 –

0

セルフテーブル

ケース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 
+0

これは間違った結果をもたらします。 innerの代わりにouter joinを使用します。あなたの質問とOPの違いは? –

+0

私はあなたがマネージャーを持つ従業員だけを望んでいると思っていました。私は両方のオプションを書いた – niktrs

+0

私はトピックスターターではない:-)私は推測した。 –

1
 
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 

;with CTE AS 
(
    Select empid,empname,managerID, 
    Cast(empname As Varchar(max)) As ReportingManager 
    from @T 
    where managerID is null 

    UNION ALL 

    Select T.empid,T.empname,T.managerID, 
    Cast(CTE.empname+'->'+t.empname As Varchar(max)) As ReportingManager 
    from @T As T 
    INNER JOIN CTE ON T.managerID=CTE.empid 
) 
SELECT * 
FROM CTE 

0

あなたは他の方法を求めました。これはちょっと変だ。私は実際に十数千ノードの持つ大規模なXMLツリーを生成するためにこれを使用している

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

この出力を与え、それはかなり速いです

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 [email protected] 
    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') 

。おそらく、ルートクエリを子クエリとマージする方法がありますが、私はそれをまだ分かりませんでした。過去にこの手法を使用していたときは、階層を定義するために別のリンクとノードテーブルを使用しました。

+0

"これはちょっと変なことです。 - あなたは決して失望しない、私の友人:)。 –

関連する問題