我正在使用SQL进行战斗。
任务是为每个项目(PROJ_EMP.PROJNO)编写max(EMP.SAL)
我有3张桌子。
保存有关项目数据的表PROJ:
PROJ.PROJNO | PROJ.NAME
------------+-------------
1 | PROJECT1
2 | PROJECT2
3 | PROJECT3
员工数据表EMP:
EMP.EMPNO | EMP.NAME | EMP.SALARY
----------+----------+------------
1000 | name1 | 4000
1001 | name2 | 2000
1002 | name3 | 3000
1003 | name4 | 6000
1004 | name5 | 1000
表PROJ_EMP用于将这些项目与员工联系起来:
PROJ_EMP.EMPNO | PROJ_EMP.PROJNO
---------------+----------------
1000 | 1
1001 | 1
1002 | 2
1003 | 2
1004 | 3
我在开始的文章中提到过:我正在尝试在where子句中使用相关子查询为每个项目编写max(EMP.SAL),因此所需结果应该是:
PROJ_EMP.PROJNO | EMP.EMPNO | EMP.SAL
----------------+-----------+---------
1 | 1000 | 4000
2 | 1003 | 6000
3 | 1004 | 1000
我没有任何工作结果,但是我的SQL查询已关闭以达到目标:
SELECT EMP.EMPNO, EMP.SAL, PROJ_EMP.PROJNO
FROM EMP, PROJ_EMP
WHERE EMP.EMPNO = PROJ_EMP.EMPNO
AND EMP.SAL = (SELECT MAX(EMP.SAL)
FROM EMP, PROJ_EMP p_e
WHERE EMP.EMPNO = PROJ_EMP.EMPNO
AND PROJ_EMP.PROJNO = p_e.PROJNO)
GROUP BY
PROJ_EMP.PROJNO, EMP.SAL, EMP.EMPNO
ORDER BY
PROJ_EMP.PROJNO, EMP.SAL DESC
结果与我预期的不同。你能帮助我吗?谢谢您的提前帮助
答案 0 :(得分:4)
学习使用正确的,明确的,标准 JOIN
语法。我认为您正在尝试写:
SELECT e.EMPNO, e.SAL, pe.PROJNO
FROM EMP e JOIN
PROJ_EMP pe
ON e.EMPNO = pe.EMPNO
WHERE EMP.SAL = (SELECT MAX(EMP.SAL)
FROM EMP e2 JOIN
PROJ_EMP pe2
ON e2.EMPNO = pe2.EMPNO
WHERE pe2.PROJNO = pe.PROJNO
)
ORDER BY pe.PROJNO, e.SAL DESC ;
答案 1 :(得分:0)
您可以在三个表中应用inner join
,并按max
分析函数进行过滤,该函数按项目编号划分并按递减的薪水排序,以确定每个项目编号的最高薪水:
select projno, empno, salary
from
(
select p.projno, e.empno, e.salary,
max(e.salary) over (partition by p.projno order by e.salary desc) as max_salary
from proj p
join proj_emp pe on pe.projno = p.projno
join emp e on e.empno = pe.empno
)
where salary = max_salary;