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-是的这里不需要按部门划分。据我所知,您可以通过编辑以顺序使用聚合。。。缺少右括号。