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,并将相关列添加到 select
和 group 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
)
我正在尝试执行任务 '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,并将相关列添加到select
和group 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
)