SQL Server 2008:
我有一个由员工和经理组成的层次结构(都带有员工ID号)。老板是爱丽丝,是比尔的经理。爱丽丝是克劳迪娅,蒂姆是经理。比尔是弗雷德的经理。
The Boss (100)
|
+------------------+
| |
Alice(101) Bill(102)
| |
+-----------+ |
Claudia(103) Tim(104) Fred(105)
从表上看,有两个表,一个empl主表(employee_peeps),然后是一个管理者与员工关系的表(manager_codes)。表格如下:
employee_peeps: manager_codes
badge_ID emplName badge_ID manager_ID
-------- -------- -------- ----------
100 The Boss 100 0
101 Alice 101 100
102 Bill 102 100
103 Claudia 103 101
104 Tim 104 101
105 Fred 105 102
我试图查询主表两次-一次查询员工姓名,然后再次查询同一行中的经理姓名。我尝试遵循joining the same table twice on different columns中的逻辑,但似乎什么也做不成。我正在寻找的是这个
Desired result:
badge_ID Employee Manager
-------- -------- -------
100 The Boss {null}
101 Alice The Boss
102 Bill The Boss
103 Claudia Alice
104 Tim Alice
105 Fred Bill
我们有300名员工...从理论上讲,只有公司总裁没有老板。是否可以在一个SQL语句中查询雇员姓名,然后再次击中主表以在同一结果行上获得经理的姓名?
在此示例中,有一些易用的代码可以制作表格:
CREATE TABLE employee_peeps
([badge_ID] int, [emplName] varchar(15))
;
INSERT INTO employee_peeps
([badge_ID], [emplName])
VALUES
(100, 'The Boss'),
(101, 'Alice'),
(102, 'Bill'),
(103, 'Claudia'),
(104, 'Tim'),
(105, 'Fred')
;
CREATE TABLE manager_codes
([badge_ID] int, [manager_ID] int)
INSERT INTO manager_codes
([badge_ID], [manager_ID])
VALUES
(100,0),
(101,100),
(102,100),
(103,101),
(104,101),
(105,102)
;
谢谢, 约翰
答案 0 :(得分:2)
select
e.badge_id, e.emplName, t.manager_id, t.managerName
from employee_peeps e
outer apply (select m.manager_id,
e2.emplName
from manager_codes m
inner join employee_peeps e2 on m.manager_id = e2.badge_id
where m.badge_id = e.badge_id
) t (manager_id, managerName);
答案 1 :(得分:0)
我知道已经回答了(谢谢@cetin basoz),但是我回到joining the same table twice on different columns尝试再次找出答案。我下载了FlySpeed,并尝试通过将employee_peeps表两次拖到构建器中来可视化地构建查询(第二个实例作为employee_peeps1)。构建器的确以与其他帖子相同的格式构建了语句,并带有两个内部联接-并且它起作用。再次感谢大家的帮助。
SELECT
employee_peeps.badge_ID,
employee_peeps.emplName,
manager_codes.manager_ID,
employee_peeps1.emplName AS emplName1
FROM
employee_peeps
INNER JOIN manager_codes ON manager_codes.badge_ID =
employee_peeps.badge_ID
INNER JOIN employee_peeps employee_peeps1 ON
employee_peeps1.badge_ID = manager_codes.manager_ID