我需要创建一个查询,显示员工的姓氏,员工ID,该员工经理的姓氏以及该经理的ID。
该员工的姓氏,身份和经理ID很容易,因为它已经在一行中,这意味着以下就足够了:
SELECT last_name,
employee_id,
(SELECT last_name FROM employees WHERE employee_id = manager_id),
manager_id
FROM employees
WHERE manager_id IS NOT NULL;
但要获取经理的last_name,您必须按照从员工那里获得的经理ID搜索同一个表。我找到的解决方案是:
{{1}}
然而,似乎' manager_id'不在子查询中工作(虽然我预期)并且输出为NULL(对于经理ID,所有其他列都有值)。
所以我的问题是,如何在子查询中使用manager_id?
附注:每个员工的manager_id可能不同,因此使用常量值不起作用。
答案 0 :(得分:2)
您需要的是相关子查询。我强烈建议您在所有查询中使用表别名和限定列名。但是,这些对于相关子查询尤为重要。
您应该将此查询编写为:
SELECT e.last_name, e.employee_id,
(SELECT m.last_name
FROM employees m
WHERE m.employee_id = e.manager_id
),
e.manager_id
FROM employees e
WHERE e.manager_id IS NOT NULL;
别名e
是外部查询中employees
的表引用的缩写。别名m
是子查询中表引用的缩写。
请注意,所有列引用都使用表别名。这使得查询具有明确性,可以防止意外错误,并使查询更容易让您和其他人理解。
答案 1 :(得分:1)
您可以使用自内联接(具有相同表的联接)
SELECT
a.last_name
, a.employee_id
, b.last_name
, a.manager_id
FROM employees a
INNER JOIN employees b ON b.employee_id = a.manager_id;
仅当a.manager_id不为null时,内部联接才起作用,因此您可以在条件
的情况下避免这种情况答案 2 :(得分:1)
当您想要引用外部查询中的表时,您需要使用完整的表名,如table.field
,或者,如果您的情况下,如果外部查询表与子查询表相同,您需要为外部查询表分配一个别名,并在子查询中使用它,如下所示:
SELECT
last_name, employee_id,
(SELECT last_name FROM employees WHERE employee_id = emp_outer.manager_id),
manager_id
FROM employees emp_outer
WHERE manager_id IS NOT NULL;