【问题标题】:Query simplification by using oracle sample database使用oracle示例数据库简化查询
【发布时间】:2016-04-10 07:35:11
【问题描述】:

任务: 列出每个部门最高和最低薪员工的姓名和薪水。 您也可以分别执行最高和最低的查询。

尝试查询:

SELECT dept.deptno, 
       dname, 
       minsal, 
       maxsal 
FROM   dept, 
       (SELECT deptno, 
               Max (sal) MAXSAL 
        FROM   emp 
        GROUP  BY deptno) MAXSALARY, 
       (SELECT deptno, 
               Min (sal)MINSAL 
        FROM   emp 
        GROUP  BY deptno) MINSALARY 
WHERE  MAXSALARY.deptno = dept.deptno 
       AND MINSALARY.deptno = dept.deptno; 

结果

结果是正确的。

问题) 有没有其他方法可以简化查询?

【问题讨论】:

    标签: sql database oracle11g


    【解决方案1】:

    您可以使用 ORACLE 的窗口函数,例如 row_number,并结合使用 CASE EXPRESSION 的条件聚合:

    SELECT t.ename,t.dname,
           MAX(CASE WHEN t.low_ind = 1 then t.salary END),
           MAX(CASE WHEN t.high_ind = 1 then t.salary END)
    FROM (SELECT e.name as ename,d.name as dname,e.salary, 
                 ROW_NUMBER() OVER(PARTITION BY d.name ORDER BY e.salary ASC) as low_ind,
                 ROW_NUMBER() OVER(PARTITION BY d.name ORDER BY e.salary DESC) as high_ind 
          FROM emp e
          INNER JOIN dept d
           ON(d.deptno = e.deptno)) t
    GROUP BY t.ename,t.dname
    

    编辑:如果您只需要每个部门的最低和最高工资,那么这就是一个简单的 group by 子句:

    SELECT d.deptno,d.dname,MIN(e.salary) as min_sal,MAX(e.salary) as max_sal
    FROM dept d
    INNER JOIN emp e
     ON(d.deptno = e.deptno)
    GROUP BY d.deptno,d.name
    

    【讨论】:

    • 我是 sql 的初学者。那么我们可以通过使用简单的子查询来简化它吗? @sagi
    • @nafeesahmed 您需要带回员工姓名吗?或者你只需​​要输出 -> DEPname,maxSal,minSal ?
    • 我只需要 DEPname,maxSal,minSal
    【解决方案2】:

    SELECT d.dname, Max(e.sal) MAXSAL, Min(e.sal) MINSAL FROM d, emp e 哪里 d.deptno = e.deptno 按 d.dname 分组

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多