我有一个查询,看起来像下面这样,它完全太慢了,我不知道如何加快它的速度。此查询当前已关联。一个临时表可以解决这个问题吗?
SELECT
e.ID, e.Name
FROM
Employees e
WHERE
e.Salary > (SELECT AVG(e2.Salary)
FROM Employees e2
WHERE e2.DepartmentID = e.DepartmentID)发布于 2016-07-29 14:46:41
请尝试以下SQL查询
with cte as (
select
*,
AVG(Salary) over (partition by DepartmentID) average
from employees
)
select * from cte where Salary > average在这里,您将看到我使用了SQL Average aggregation function with Partition By子句,为了使用它,我更喜欢使用SQL CTE表达式
发布于 2016-07-29 14:44:11
我会尝试将子查询移动到连接中。如果DepartmentID上有一个包含salary列的索引,那么它将快速生成子查询结果,并将其连接到主结果。
SELECT e.ID,
e.Name
FROM Employees e
INNER JOIN (
SELECT DepartmentID, AVG(Salary) as AverageSalary
FROM Employees
GROUP BY DepartmentId
) dptAvg ON e.DepartmentID = dptAvg.DepartmentId
WHERE
e.Salary > dptAvg.AverageSalary发布于 2016-07-29 14:46:07
这不仅仅是select,考虑一下用例。在添加或更新员工的工资时,您需要计算平均工资,但您可能需要更频繁地使用此查询。每次读取时都要重新计算,这是没有意义的。
我将分离第二个查询,将结果存储在名为AvgSalary的字段中的Departments表(我假设您有一个)中,然后使查询如下所示:
SELECT
e.ID,
e.Name
FROM
Employees e
JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE
e.Salary > d.AvgSalaryhttps://stackoverflow.com/questions/38652044
复制相似问题