2015-05-28 247 views
-3
select E.eid from Employee E 
    where E.salary = (
     select max (E2.salary) from Employee E2 
      where E2.salary ≠ (
       select max (E3.salary) from Employee E3); 

如何處理上述查詢? 這個查詢返回什麼? 子查詢處理的順序是什麼?sql中的複雜查詢

回答

0

最遠處於第一位。它發現最高薪水爲E3第一,然後找到不是最高的(第二高),然後找到與第二高薪水相匹配的員工。

因此,這將返回排名第二高的任何員工的身份(關係表現爲在E2級別上淘汰所有具有最高薪水的每個人都會返回薪水第二高的所有人)。

我懷疑你正在得到downvotes,因爲這是平凡的檢查sqlfiddle,這也會顯示你的語法錯誤(沒有關閉所有的括號)。

這裏是它的一個小提琴:http://sqlfiddle.com/#!9/a7d18/6

+0

不關心syntax.Just希望與報表功能明確。在aggegate函數的情況下,是否首先獲取記錄,然後計算聚合? –

+0

我認爲描述它的最簡單的方法是:它嘗試評估第一部分(e.salary = X),但必須計算內部(X),然後嘗試計算第二部分(E2.salary < > Y),然後必須計算內部(Y),所以它計算(Y)中最遠的,然後可以評估下一個級別(X),然後最終可以返回最外面。就第一次抓取而言,然後聚合(假設默認鎖定),它會抓取,但不會讓任何人在完成其他所有操作時更改值。它不預取,只是將每個查詢都視爲一個完整的操作。 –