有人可以解释以下SQL查询如何获得'n'最高薪水

时间:2009-02-02 05:22:56

标签: sql-server sql-server-2005

SELECT * 来自员工A. WHERE 3 =(选择计数(*)+1 来自员工B. 其中B.salary> A.salary)

这是第三高薪;有人可以解释这个查询背后的逻辑以及它是如何工作的。

4 个答案:

答案 0 :(得分:4)

简而言之,这个查询将是“选择另外两名薪水更高的员工”。因此,结果是薪水第三高的员工。

请注意,如果有两个或更多人具有完全相同的薪水,则此查询可能会失败。

答案 1 :(得分:1)

这只适用于Distinct Salaries:

对于每位员工,计算薪水大于员工薪水的行数。如果计数为2 + 1,则返回员工

因此它将返回第3名雇员。

我会使用SELECT TOP 1 FROM(SELECT TOP 3 * FROM Employee ORDER BY Salary DESC)a SALDER ASC

答案 2 :(得分:1)

这就是所谓的相关子查询。您可以将其视为循环遍历外部查询中的所有记录,并且每个记录都在where子句中评估查询。 (发生这种情况是因为where子句中的查询引用了外部查询的别名“A”)

因此,对于每位员工,都要计算薪水较高的员工人数。

您可以在SQL 2005&中快速实现此逻辑。 2008年使用ROW_NUMBER函数。

例如

WITH SalaryOrder AS
(
SELECT *
   , ROW_NUMBER() OVER(ORDER BY Salary DESC) SalaryRank
FROM employee
)
SELECT * 
FROM SalaryOrder
WHERE SalaryRank = 3

答案 3 :(得分:0)

用一个例子来说明这个,说工资如下;重复了B的数据,

EmpA EmpB

5000 5000

3000 3000

2000 2000

1500 1500

1000 1000

<500> 500 500

在第一个解析中,A.Salary是5000,所以从B超过5000的所有工资计数都是0.加1和它1.现在这将是最高工资。 在你的例子中,A.Salary是2000,所以从B超过2000的所有工资计数将是2,加一,它将是3.加入3 = 3和A.Salary值2000将被选中。