SQL SELECT 有子查询

SQL SELECT WITH SUBQUERY IN HAVING

我正在尝试执行任务 'For each department (give the number) list the people who have worked in the most projects'

我正在处理 Oracle 测试数据(EMP、DEPT、PROJ,PROJ_EMP) ,到目前为止我试过这个

SELECT e.ename, d.deptno, COUNT(*)
FROM PROJ p, EMP e, PROJ_EMP pe, dept d
WHERE e.empno = pe.empno AND pe.projno = p.projno AND d.deptno=e.deptno
GROUP BY e.ename, d.deptno
HAVING COUNT(*) = (SELECT LICZBA_PROJEKTOW
FROM 
(SELECT e.ename, COUNT(*) LICZBA_PROJEKTOW
FROM PROJ p, EMP e, PROJ_EMP pe
WHERE e.empno = pe.empno AND pe.projno = p.projno
GROUP BY e.ename) PROJEKTY
WHERE PROJEKTY.ename = e.ename);

但我只得到这个结果:

ENAME          PROJNO        SAL
---------- ---------- ----------
SCOTT               1       3000
KING                2       5000
FORD                3       3000
SCOTT               3       3000
FORD                4       3000
SCOTT               5       3000

对我做错了什么有什么建议吗?

编辑: 根据建议我使用内部连接,得到与 aerlier

相同的输出
SELECT e.ename, d.deptno, COUNT(*) ILE_PROJEKTOW
FROM EMP e
INNER JOIN DEPT d ON d.deptno=e.deptno
INNER JOIN PROJ_EMP pe ON e.empno = pe.empno
INNER JOIN PROJ p ON pe.projno = p.projno
GROUP BY e.ename, d.deptno;

我提供了哪些条件才能获得预期的输出? (它必须有子查询)

我会推荐 window 函数:

select *
from (
    select e.ename, e.deptno, count(*) as cnt_projects
        rank() over(partition by e.deptno order by count(*) desc) rn
    from proj_emp pe 
    inner join proj p on p.projno = pe.projno
    inner join emp  e on e.empno  = pe.empno
    group by e.empno, e.ename, e.deptno
) t
where rn = 1

对于每个部门,这会为员工带来最多的项目 - 包括高层关系(如果有的话)。

备注:

  • 使用显式连接!隐式连接是遗留语法,不应在新代码中使用

  • 您不需要 table dept 来获得您想要的结果;如果您需要显示部门名称之类的内容而不仅仅是其编号,那么您通常会加入 table,并将相关列添加到 selectgroup by 子句


如果您真的想使用 having 执行此操作,那么您将使用带有行限制子句的相关子查询:

select e.ename, e.deptno, count(*) as cnt_projects
from proj_emp pe 
inner join proj p on p.projno = pe.projno
inner join emp  e on e.empno  = pe.empno
group by e.empno, e.ename, e.deptno
having count(*) = (
    select count(*)
    from proj_emp pe1
    inner join proj p1 on p1.projno = pe1.projno
    inner join emp  e1 on e1.empno  = pe1.empno
    where e1.deptno = e.deptno
    group by e1.empno
    fetch first 1 row only
)