【问题标题】:How to get the employees with their managers如何让员工和他们的经理在一起
【发布时间】:2011-11-19 02:06:29
【问题描述】:

这是我希望输出的样子:

Employee   Emp# Manager Mgr# 
   BLAKE   7698 KING    7839 
   CLARK   7782 KING    7839 
   JONES   7566 KING    7839 
   MARTIN  7654 BLAKE   7698 
   ALLEN   7499 BLAKE   7698 
   TURNER  7844 BLAKE   7698 
   JAMES   7900 BLAKE   7698 
   WARD    7521 BLAKE   7698 
   FORD    7902 JONES   7566 
   SMITH   7369 FORD    7902 
   SCOTT   7788 JONES   7566 
   ADAMS   7876 SCOTT   7788 
   MILLER  7934 CLARK   7782 

这是我得到的:

 SQL> SELECT ename, empno, (SELECT ename FROM EMP WHERE empno = mgr)AS MANAGER, mgr from emp order by empno;

 ENAME           EMPNO MANAGER           MGR
 ---------- ---------- ---------- ----------
 SMITH            7369                  7902
 ALLEN            7499                  7698
 WARD             7521                  7698
 JONES            7566                  7839
 MARTIN           7654                  7698
 BLAKE            7698                  7839
 CLARK            7782                  7839
 SCOTT            7788                  7566
 KING             7839
 TURNER           7844                  7698
 ADAMS            7876                  7788

 ENAME           EMPNO MANAGER           MGR
 ---------- ---------- ---------- ----------
 JAMES            7900                  7698
 FORD             7902                  7566
 MILLER           7934                  7782

我找不到经理字段为空的原因。

这是桌子:

 SQL> select empno, ename, job,deptno, mgr from emp;

 EMPNO ENAME      JOB           DEPTNO        MGR
 ---------- ---------- --------- ---------- ----------
  7839 KING       PRESIDENT         10
  7698 BLAKE      MANAGER           30       7839
  7782 CLARK      MANAGER           10       7839
  7566 JONES      MANAGER           20       7839
  7654 MARTIN     SALESMAN          30       7698
  7499 ALLEN      SALESMAN          30       7698
  7844 TURNER     SALESMAN          30       7698
  7900 JAMES      CLERK             30       7698
  7521 WARD       SALESMAN          30       7698
  7902 FORD       ANALYST           20       7566
  7369 SMITH      CLERK             20       7902

 EMPNO ENAME      JOB           DEPTNO        MGR
 ---------- ---------- --------- ---------- ----------
  7788 SCOTT      ANALYST           20       7566
  7876 ADAMS      CLERK             20       7788
  7934 MILLER     CLERK             10       7782

已选择 14 行。

【问题讨论】:

  • 您必须查看 empnos 才能找到每个人的经理。
  • 如果你看一下表格,你会看到 scott,他的 empno 是 7788,他的经理是 jones,他的 empno 是 7566
  • (SELECT ename FROM EMP WHERE empno = mgr) 是问题所在;没有管理自己的员工,并且此查询不返回任何应有的结果。您需要进行自联接才能获得这种关系。
  • @user770022 - 正确,这两件事不相等。 7788 != 7566
  • 我正在寻找如何重写它的想法

标签: sql oracle sqlplus


【解决方案1】:

这是一个经典的自加入,尝试以下:

SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM
    emp e, emp m
WHERE e.mgr = m.empno

如果你想包含没有经理的总裁,那么在 Oracle 语法中使用 outer 加入而不是 inner 加入:

SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM
    emp e, emp m
WHERE e.mgr = m.empno(+)

或者在 ANSI SQL 语法中:

SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM
    emp e
    LEFT OUTER JOIN emp m
        ON e.mgr = m.empno

【讨论】:

  • 我们可以聊天吗?我想了解您是如何想到的。您给出了正确的输出,但我想了解您是如何得到的。
  • 使用内部连接你不会得到总统(因为他们没有经理)
  • 感谢您的帮助,我找到了我想要的东西。
【解决方案2】:
(SELECT ename FROM EMP WHERE empno = mgr)

EMP 中没有符合此条件的记录。

您需要自行加入才能获得此关系。

SELECT e.ename AS Employee, e.empno, m.ename AS Manager, m.empno
FROM EMP AS e LEFT OUTER JOIN EMP AS m
ON e.mgr =m.empno;

编辑:

您选择的答案不会列出您的总统,因为它是一个内联。我想当你发现你的输出不是你(我怀疑)家庭作业所要求的时候你会回来的。这是实际的测试用例:

> select * from emp;

 empno | ename |    job    | deptno | mgr  
-------+-------+-----------+--------+------
  7839 | king  | president |     10 |     
  7698 | blake | manager   |     30 | 7839
(2 rows)

> SELECT e.ename employee, e.empno, m.ename manager, m.empno
FROM emp AS e LEFT OUTER JOIN emp AS m
ON e.mgr =m.empno;

 employee | empno | manager | empno 
----------+-------+---------+-------
 king     |  7839 |         |      
 blake    |  7698 | king    |  7839
(2 rows)

不同之处在于外连接返回所有行。内连接将产生以下结果:

> SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM emp e, emp m
WHERE e.mgr = m.empno;

 ename | empno | manager | mgr  
-------+-------+---------+------
 blake |  7698 | king    | 7839
(1 row)

【讨论】:

  • 如果您查看员工编号和经理编号,就会发现
  • 如果您查看 Scott,他的 empno 是 7788,他的经理编号是 7566,即 jones。
  • 不一样。 7788 != 7566
  • SELECT e.ename AS 'Employee', m.ename AS 'Manager', FROM EMP AS e LEFT OUTER JOIN EMP AS m ON e.mgr =m.empno * ERROR at line 1: ORA -00923: 在预期的地方找不到 FROM 关键字
  • “经理”后面有一个悬空的逗号,在编辑添加员工编号时已修复。
【解决方案3】:

您可以将查询更改为:

SELECT ename, empno, (SELECT ename FROM EMP WHERE empno = e.mgr)AS MANAGER, mgr 
from emp e 
order by empno;

这将告诉引擎对于内部 emp 表,empno 应该与外部表中的 mgr 列匹配。

【讨论】:

    【解决方案4】:

    试试这个

    SELECT E.ename,E.empno,ISNULL(E.ename,'NO MANAGER') AS MANAGER FROM emp e
    INNER JOIN emp M
    ON  M.empno=E.empno
    

    代替子查询使用自连接

    【讨论】:

      【解决方案5】:

      也许您的子查询(SELECT ename FROM EMP WHERE empno = mgr) 认为,给我他们自己经理的员工记录! (即,一行的empno与same行的mgr相同。)

      您是否考虑过重写它以使用内部(自)连接? (我在问,因为我什至不确定以下是否可行。)

      SELECT t1.ename, t1.empno, t2.ename as MANAGER, t1.mgr
      from emp as t1
      inner join emp t2 ON t1.mgr = t2.empno
      order by t1.empno;
      

      【讨论】:

      • 我正在寻找如何重写它的想法。
      • @user770022,我在发布后不久编辑了我的答案,以包含我的意思。虽然我看到这个页面上已经有另一个答案暗示了同样的事情(尽管语法略有不同)
      【解决方案6】:

      这是此问题的替代答案,您可以选择“分层查询”选项,而不是使用自联接。它速度快,并且与连接相比有几个优点。

      SELECT ename as employee, empno, prior ename as manager, prior empno as mgrno
      FROM emp
      start with mgr is null
      connect by mgr = prior empno;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-20
        • 2020-07-25
        • 2022-12-12
        • 2011-12-08
        • 1970-01-01
        相关资源
        最近更新 更多