SELECT * 来自员工A. WHERE 3 =(选择计数(*)+1 来自员工B. 其中B.salary> A.salary)
这是第三高薪;有人可以解释这个查询背后的逻辑以及它是如何工作的。
答案 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将被选中。