选择有2名员工的经理

时间:2015-11-18 13:52:33

标签: sql oracle

我有一张这样的表:

EMPNO   ENAME   JOB         MGR
7369    SMITH   CLERK       7902
7499    ALLEN   SALESMAN    7698
7521    WARD    SALESMAN    7698
7566    JONES   MANAGER     7839
7654    MARTIN  SALESMAN    7698
7698    BLAKE   MANAGER     7839
7782    CLARK   MANAGER     7839
7788    SCOTT   ANALYST     7566
7839    KING    PRESIDENT   null
7844    TURNER  SALESMAN    7698
7876    ADAMS   CLERK       7788
7900    JAMES   CLERK       7698
7902    FORD    ANALYST     7566
7934    MILLER  CLERK       7782

我需要选择只有2名员工的所有经理(英语.MGR字段必须等于MANAGER的EMPNO)

我可以使用PARTITION或其他OLAP功能吗?

4 个答案:

答案 0 :(得分:2)

例如:

SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING count(employee_id)=2

答案 1 :(得分:2)

  

我可以使用PARTITION吗

不确定。分析肯定会这样做。使用 COUNT()OVER()

例如,在SCOTT模式中使用标准EMP表:

SQL> WITH DATA AS(
  2  SELECT e.*, count(empno) OVER(PARTITION BY mgr ORDER BY NULL) cnt
  3  FROM emp e
  4  )
  5  SELECT empno, ename, mgr
  6  FROM DATA
  7  WHERE cnt = 2;

     EMPNO ENAME             MGR
---------- ---------- ----------
      7902 FORD             7566
      7788 SCOTT            7566

答案 2 :(得分:1)

您可以使用子查询:

SELECT * FROM employees e1 WHERE (SELECT COUNT(*) FROM employees e2 WHERE e2.MGR = e1.EMPNO) >= 2

答案 3 :(得分:0)

设法做到这一点:

SELECT data.mgr, d.ENAME
FROM EMP d
INNER JOIN (SELECT DISTINCT e.MGR, count(empno) OVER(PARTITION BY mgr ORDER BY NULL) cnt FROM emp e) data 
ON data.mgr = d.EMPNO 
WHERE cnt = 2;

是否有更好/更好或更短的方式?