【问题标题】:SQL query with correlated subquery in where clause在 where 子句中具有相关子查询的 SQL 查询
【发布时间】:2019-10-30 17:52:03
【问题描述】:

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

结果并不像我预期的那样。你能帮助我吗?提前感谢您的任何帮助

【问题讨论】:

  • 我会尝试重新设计一些查询,但即使使用此查询,也尝试为外部 PROJ_EMP 提供别名并在内部 WHERE 子句中明确指定它

标签: sql oracle


【解决方案1】:

学习使用正确、明确、标准 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 ; 

【讨论】:

  • 谢谢。我完全迷失了自己,忘记了加入。
【解决方案2】:

您可以在三个表中应用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多