对不同列的相同 table 查询两次
Query twice on same table for different columns
SQL 服务器 2008:
我有一个员工和经理的层次结构(都有员工 ID 号)。老板是爱丽丝和比尔的经理...爱丽丝是克劳迪娅和蒂姆的经理...比尔是弗雷德的经理
The Boss (100)
|
+------------------+
| |
Alice(101) Bill(102)
| |
+-----------+ |
Claudia(103) Tim(104) Fred(105)
Table 明智的是,有两个 table 一个 empl master table (employee_peeps),然后是一个 table 经理与员工关系 ( manager_codes)。 table 看起来像这样:
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
我正在尝试查询主 table 两次 - 一次查询员工姓名,然后再次查询同一行中经理的姓名。我已尝试遵循 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 语句中查询员工姓名,然后再次点击主 table 以在同一结果行中获取经理的姓名?
这里有一些用于制作此示例的 table 的可用代码:
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)
;
谢谢,
约翰
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);
我知道这已经得到解答(谢谢@cetin basoz),但我回到 joining the same table twice on different columns 再次尝试解决这个问题。我下载了 FlySpeed 并尝试通过将 employee_peeps table 拖到生成器中两次来直观地构建查询(对于第二个实例,如 employee_peeps1)。构建器确实以与其他 post 相同的格式构建了带有两个内部联接的语句 - 并且它有效。再次感谢大家的帮助。
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
SQL 服务器 2008:
我有一个员工和经理的层次结构(都有员工 ID 号)。老板是爱丽丝和比尔的经理...爱丽丝是克劳迪娅和蒂姆的经理...比尔是弗雷德的经理
The Boss (100)
|
+------------------+
| |
Alice(101) Bill(102)
| |
+-----------+ |
Claudia(103) Tim(104) Fred(105)
Table 明智的是,有两个 table 一个 empl master table (employee_peeps),然后是一个 table 经理与员工关系 ( manager_codes)。 table 看起来像这样:
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
我正在尝试查询主 table 两次 - 一次查询员工姓名,然后再次查询同一行中经理的姓名。我已尝试遵循 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 语句中查询员工姓名,然后再次点击主 table 以在同一结果行中获取经理的姓名?
这里有一些用于制作此示例的 table 的可用代码:
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)
;
谢谢, 约翰
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);
我知道这已经得到解答(谢谢@cetin basoz),但我回到 joining the same table twice on different columns 再次尝试解决这个问题。我下载了 FlySpeed 并尝试通过将 employee_peeps table 拖到生成器中两次来直观地构建查询(对于第二个实例,如 employee_peeps1)。构建器确实以与其他 post 相同的格式构建了带有两个内部联接的语句 - 并且它有效。再次感谢大家的帮助。
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