我有一个如下所示的查询,它只是完全太慢而且我不知道如何加快速度。此查询目前是相关的。那么临时表会加入解决这个问题吗?
SELECT
e.ID, e.Name
FROM
Employees e
WHERE
e.Salary > (SELECT AVG(e2.Salary)
FROM Employees e2
WHERE e2.DepartmentID = e.DepartmentID)
答案 0 :(得分:3)
请尝试以下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表达式
答案 1 :(得分:0)
我会尝试将子查询移动到连接中。如果DepartmentID
上有一个包含工资列的索引,那么它将快速生成子查询结果并将其加入主结果。
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
答案 2 :(得分:0)
它不仅仅是选择,想到用例。您需要在添加或更新员工薪水时计算平均工资,但您可能更频繁地需要此查询。每次阅读都无法重新计算。
我会将第二个查询分开,将结果存储在名为Departments
的字段中的AvgSalary
表中(我假设你有一个),然后让查询看起来像: / p>
SELECT
e.ID,
e.Name
FROM
Employees e
JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE
e.Salary > d.AvgSalary
答案 3 :(得分:0)
首先,我建议您尝试CROSS APPLY here了解更多信息:
SELECT e.ID,
e.Name
FROM Employees e
CROSS APPLY (
SELECT AVG(e2.Salary) as avgs
FROM Employees e2
WHERE e2.DepartmentID = e.DepartmentID
) as p
WHERE e.Salary > avgs
如果您使用的是SQL Server 2012及更高版本,则可以将CTE与AVG OVER
一起使用;WITH cte AS (
SELECT e.ID,
e.Name,
AVG(e.Salary) OVER (PARTITION BY e.DepartmentID ORDER BY e.ID) as avgs,
e.Salary
FROM Employees e
)
SELECT ID,
Name
FROM cte
WHERE Salary > avgs
答案 4 :(得分:0)
预先计算每个部门的平均工资,并在进一步的查询中使用它。
SELECT AVG(e2.Salary) as avgSalary,DepartmentID into #t
FROM Employees
group by DepartmentID
SELECT e.ID,
e.Name
FROM
Employees e
WHERE
e.Salary > (
SELECT avgSalary
FROM #t e2
WHERE e2.DepartmentID = e.DepartmentID)