Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Oracle-最佳查询_Sql_Oracle_Performance_Join - Fatal编程技术网

SQL Oracle-最佳查询

SQL Oracle-最佳查询,sql,oracle,performance,join,Sql,Oracle,Performance,Join,我有三个具有以下模式的表: Persons(Person_id, Department_id, Sure_name, Name, Birthyear, Height, Manager_id) Departments (Department_id, Department_Name, Code) Salaries (Salary_id, Person_id, Salary) 我需要运行一个查询,该查询将显示部门名称,对于该部门,工人的最低和最高身高之间的差异最大 我是这样做的: select De

我有三个具有以下模式的表:

Persons(Person_id, Department_id, Sure_name, Name, Birthyear, Height, Manager_id)
Departments (Department_id, Department_Name, Code)
Salaries (Salary_id, Person_id, Salary)
我需要运行一个查询,该查询将显示部门名称,对于该部门,工人的最低和最高身高之间的差异最大

我是这样做的:

select Department_Name
from Departments
where Department_id = (select Department_id
                      from Departments 
                      join Persons 
                      using (Department_id)
                      group by Department_id
                      having max(height) - min(height) = (select max(max(height) - min(height)) 
                                                          from Departments 
                                                          join Persons 
                                                          using (Department_id) 
                                                          group by Department_id));
它工作得很好,只是我不确定解决方案是否最优,这里有两个嵌套查询,我想知道是否可以用更简单的方法实现相同的结果。

试试这个

SELECT Department_Name
FROM   Departments D
       INNER JOIN (SELECT Department_id,
                          Max(height) - Min(height) AS diff
                   FROM   Departments
                          JOIN Persons
                            ON using (Department_id)
                   WHERE ROWNUM = 1
                   GROUP  BY Department_id
                   ORDER  BY diff DESC) B
               ON d.Department_id = b.Department_id 
或使用
窗口功能

SELECT Department_id,
       Department_Name
FROM   (SELECT Row_number()OVER(ORDER BY Max(height)- Min(height) desc ) rn,
               Department_id,
               Department_Name
        FROM   Departments
               JOIN Persons
                 ON using(Department_id)
        GROUP  BY Department_id,
                  Department_Name)a
WHERE  rn = 1 

这可能对您有用,有点复杂,但使用分析函数
RANK()
可能会比只使用聚合简化一些:

SELECT d.department_id, d.department_name, d.code, p1.height_diff
  FROM departments d INNER JOIN (
    SELECT department_id, height_diff, RANK() OVER ( ORDER BY height_diff DESC ) AS rn
      FROM (
        SELECT department_id, MAX(height) - MIN(height) AS height_diff
          FROM Persons
         GROUP BY department_id
      )
  ) p1
    ON d.department_id = p1.department_id
 WHERE p1.rn = 1;

N.B.我以前的订单不正确,现在更正为
DESC

您甚至可以按部门名称另外分组以省略外部连接内部连接是否等同于连接?另外,我认为“限制”在Oracle上不起作用。@user4359659-Join等于内部连接。添加了另一个答案我不太确定是否可以将聚合放在窗口函数的
OVER()
子句中。而且你不想
按部门划分\u id
@DavidFaber-是的
这里不需要按部门划分。据我所知,您可以通过编辑以
顺序使用聚合。。。缺少右括号。