where子句

时间:2019-10-30 17:52:03

标签: sql oracle

我正在使用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  

结果与我预期的不同。你能帮助我吗?谢谢您的提前帮助

2 个答案:

答案 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;

Demo