如何在子查询中使用superquery中的值?

时间:2016-10-15 09:20:17

标签: sql oracle

我需要创建一个查询,显示员工的姓氏,员工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可能不同,因此使用常量值不起作用。

3 个答案:

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