該查詢基本上是說:
for each row in employee assign to e1
count = 0
for each row in employee assign to e2
if e1.salary <= e2.salary
count = count + 1
end if
end for
if count = 3
add e1 to result set
end if
end for
return result set
總之在它正在訪問表中的第二次僱員表中的每一行,並用低於或等於工資計算的行數。如果正好有3個,它會將該行添加到結果中。
值得指出的是,如果有多名員工薪水相同,這可能會出錯。您可能想要的是帶有排名功能的查詢。類似這樣的:
SELECT salary
FROM
(SELECT
salary
,DENSE_RANK() OVER (ORDER BY salary DESC) [rank]
FROM employee) t
WHERE
[rank] = 3
究竟是什麼意思是「第三最高」也許有點含糊不清。如果我們有薪金8,8,6,5上面會返回5.如果我們想6,你將需要改變DENSE_RANK到ROW_NUMBER這樣的:
SELECT salary
FROM
(SELECT
salary
,ROW_NUMBER() OVER (ORDER BY salary DESC) [rank]
FROM employee) t
WHERE
[rank] = 3
的DENSE_RANK以上版本也返回多行受到影響如果有第三名的平局。這是否合乎要求取決於所要求的內容,但可以通過對薪水使用匯總函數來減少這一點。
SELECT MAX(salary)
FROM
(SELECT
salary
,DENSE_RANK() OVER (ORDER BY salary desc) [rank]
FROM employee) t
WHERE
[rank] = 3
對於一個非常基本的理解水平的人;爲什麼這麼複雜?難道你不能用RANK或ROW_NUMBER與ORDER BY一起完成這項工作嗎?是否有像OPs例子那樣的繼承價值? –
@StianYttervik我猜猜誰寫了它不知道RANK或ROW_NUMBER是否存在 – Caleth
好吧,關閉選民。你這一切都是錯的嗎?這是一個推薦問題。 (嚴重的是,你甚至可以從那裏得到什麼?)這個問題已經足夠清晰了,正如幾個很好的答案所證明的,這些答案解釋了查詢的功能。我甚至認爲這個問題不是「基本」的;當您仍然掌握SQL基礎知識時,被查詢困惑並不是不合理的。 (嘿,即使你知道你用SQL的方式,它可能需要花一分鐘的時間來揣摩它。)如果你要投票結束,*先找出一個好的理由*。 – jpmc26