SQL列表员工经理的电话号码和姓名,如果他们没有经理

时间:2014-07-18 18:27:08

标签: sql oracle

这是我的作业,我能够轻松获得第三名,但第四名表示与第三名相同,但也包括那些没有经理的人。我无法想出这一个,我试过案例,iif,如果那样,等我必须以错误的方式格式化它,但我找不到任何有用的书。请帮忙。

  1. 从员工表中,列出每位员工的employee_idlast_namephone_number,以及其经理的姓氏和电话号码。按employee_id对行进行排序。 (提示:表可以连接到自己。只需给每个表一个不同的别名。)
  2. SQL:

      SELECT a.employee_id,
             a.last_name,
             a.phone_number,
             b.last_name AS manger_name,
             b.phone_number AS manger_phone
        FROM l_employees a,
             l_employees b
       WHERE a.manager_id = b.employee_id
    ORDER BY a.employee_id  
    

2 个答案:

答案 0 :(得分:0)

您正在寻找的技巧是左连接:

SELECT    a.employee_id, a.last_name, a.phone_number, 
          b.last_name AS manger_name, b.phone_number AS manger_phone
FROM      l_employees a
LEFT JOIN l_employees b ON a.manager_id = b.employee_id
ORDER BY  a.employee_id

这也可以使用Oracle的隐式连接语法(请注意(+)):

SELECT   a.employee_id, a.last_name, a.phone_number,
         b.last_name AS manger_name, b.phone_number AS manger_phone
FROM     l_employees a, l_employees b
WHERE    a.manager_id = b.employee_id (+)
ORDER BY a.employee_id  

答案 1 :(得分:0)

只是为Mureinik的回答添加一点说明。这里发生的是通常只连接来自两个表的行,其中where子句中的关系为true。外连接(左连接)或(+)告诉它返回左侧表中的所有行,无论右侧表中是否匹配,但是如果匹配中在右侧的表格,继续并填写这些列。像这样的外连接是非常强大的,但有一些事情需要注意。

  1. 确保您真的想要左侧桌子上的所有内容。如果你没有在where子句中加入一些其他条款来限制表格#34; A"
  2. 所考虑的内容。
  3. 在您的情况下,空值(不在表" B"(管理员))中将为NULL。如果您在PLSQL中使用它或作为记录集返回到某个程序,您可能希望在潜在的NULL列周围放置一些NVL语句以避免错误。