【问题标题】:Sql commands Oracle [duplicate]Sql命令Oracle [重复]
【发布时间】:2019-03-24 13:39:51
【问题描述】:

我正在尝试显示所有收入高于本部门平均工资的员工的员工编号、员工姓名、部门和工资。

我只试过这个:

Select empno, ename, deptno,sal As Salary  
From emp  
Where sal >(SELECT AVG (sal) FROM emp);  

【问题讨论】:

    标签: sql oracle command


    【解决方案1】:

    对于这种结构,您可以使用关联条件。这需要引入表别名:

    select e.empno, e.ename, e.deptno, e.sal As Salary  
    from emp e
    where e.sal > (select avg(e2.sal) from emp e2 where e2.deptno = e.deptno); 
    

    【讨论】:

      【解决方案2】:

      在员工工资高于平均值的情况下,将每个deptno的平均工资加入表中效率更高:

      select e.empno, e.ename, e.deptno, e.sal   
      from emp e inner join ( 
        select deptno, avg(sal) sal from emp group by deptno
      ) t
      on t.deptno = e.deptno and t.sal < e.sal
      

      【讨论】:

        【解决方案3】:

        在 Oracle 数据库中,最有效的查询是使用分析函数:

        select empno, ename, deptno, sal from 
           (select emp.*, AVG(sal) over (partition by deptno) avgsal from emp) 
        where sal > avgsal;
        

        只需对视图进行一次表扫描和过滤。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-24
          • 2018-07-05
          • 1970-01-01
          • 1970-01-01
          • 2012-02-21
          • 1970-01-01
          相关资源
          最近更新 更多