在同一表上两次查询不同的列

时间:2018-08-07 17:06:08

标签: sql-server nested self-join

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)
;

谢谢, 约翰

2 个答案:

答案 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