SQL查询以检索在人数超过5的部门中工作的员工的详细信息

时间:2016-05-04 18:12:35

标签: sql database oracle

我有以下表格。

                        STAFF


   STAFFNO STAFFNAME  DESIGNATI     SALARY     DEPTNO
---------- ---------- --------- ---------- ----------
      1000 Rajesh     Manager        35000          1
      1001 Manoj      Caretaker    7420.35          1
      1002 Swati      HR             22500          3
      1003 Suresh     HR             23400          3
      1004 Najim      Mangager       17200          2
      1006 Ritesh     Prgrmr         23500          2
      1005 Nisha      Prgrmr         24852          1
      1007 Rajib      Security        6547          3
      1008 Neeraj     Prgrmr         17300          1
      1009 Dushant    Prgrmr         16500          1
      1010 Pradyut    Manager        26300          2
      1011 Manisha    Prgrmr         21500          2
      1012 Janak      Security        8500          2

现在我想在oracle(SQL * Plus)上运行一个查询,我可以在其中检索那些在人数达到5人以上的部门工作的员工的详细信息。(例如deptno.1和deptno.2有5在他们中工作的员工)

您可以帮我查询Oracle查询吗?提前谢谢。

4 个答案:

答案 0 :(得分:2)

您需要创建子查询或执行JOIN

首先JOIN,你需要知道哪个部门有5名以上的员工。

 SELECT DEPTNO
 FROM STAFF
 GROUP BY DEPTNO
 HAVING  COUNT(*) >= 5

现在你加入两个结果

SELECT S.*
FROM STAFF S
JOIN  ( SELECT DEPTNO
        FROM STAFF
        GROUP BY DEPTNO
        HAVING  COUNT(*) >= 5 ) F
ON S.DEPTNO = F.DEPTNO

子查询版本:

SELECT S.*
FROM STAFF S
WHERE S.DEPTNO IN ( SELECT DEPTNO
                    FROM STAFF
                    GROUP BY DEPTNO
                    HAVING  COUNT(*) >= 5 )

答案 1 :(得分:0)

如果您需要员工详细信息,那么您实际上需要一个分析功能:

select s.*
from (select s.*, count(*) over (partition by deptno) as deptcnt
      from staff
     ) s
where deptcnt >= 5;

答案 2 :(得分:0)

应该是这样的

SELECT * FROM STAFF WHERE DEPTNO IN 
(SELECT DEPTNO FROM STAFF GROUP BY DEPTNO HAVING COUNT(*)>4)

答案 3 :(得分:0)

这里使用了一个连接(因为没有人),它可以让你更容易地改变你的BI规则....

SELECT S.*
FROM STAFF S
LEFT JOIN (
  SELECT DEPTNO, COUNT(*) AS C
  FROM STAFF
  GROUP BY DEPTNO
) AS D_COUNTS ON S.DEPTNO = D_COUNT.DEPTNO
WHERE D_COUNTS.C >= 5

或作为CTE

WITH D_COUNTS AS
(
  SELECT DEPTNO, COUNT(*) AS C
  FROM STAFF
  GROUP BY DEPTNO
)
SELECT S.*
FROM STAFF S
LEFT JOIN D_COUNTS ON S.DEPTNO = D_COUNT.DEPTNO
WHERE D_COUNTS.C >= 5