SQL練習——查詢部門工資最高的員工


題目來源於leetcode:184. 部門工資最高的員工

 

 

 

 

思路:

首先是分部門的,因此肯定會用到group by ;其次各部門擁有最高工資的員工可能不僅僅只有一個人。

初步解法:

根據需求,可以先查詢Employee表中的各部門的最高工資標准,作為一個標准線,代碼如下:

select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId -- 各部門最高工資的標准 

 有了這個工資水平線,就可以用它來和員工工資進行比較,工資等於最高工資的員工使我們需要的結果,代碼如下

select d.Name Department,e.Name Employee ,e.Salary  from Employee e
left join Department d on d.Id=e.DepartmentId
left join (select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId)a on a.DepartmentId = e.DepartmentId
where e.Salary = a.Salary

  寫到這我感覺問題不大了,執行的時候輸出也和預期結果一致,但是當我提交的時候,結果卻仍然是解答錯誤,仔細看了一下提交記錄中的測試用例,看到一個提示,如下

原來當Department表記錄為空時,輸出與預期不一致。我想這個測試用例可能是出於業務上的場景考慮。

二次考慮:

造成我這種輸出的原因是我用的是左連接,即Employee表是主表,其它表不論是否有數據都不會影響記錄的行數。既然要考慮Department表的記錄數,那我不如就把Department表作為主表來連接,即對Department表進行右連接,而那個最高工資水平線的表本身就是從Employee表中查詢的,因此它的記錄行數應該小於等於Employee的記錄數,總之它的記錄數受Employee的影響,因此它采用左連接還是右連接都無關緊要。修改后的代碼如下(僅僅一個left join 改成right join)

select d.Name Department,e.Name Employee ,e.Salary  from Employee e
right join Department d on d.Id=e.DepartmentId
left join (select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId)a on a.DepartmentId = e.DepartmentId
where e.Salary = a.Salary

這樣就能提交成功了,剛開始也只是憑感覺試了一下沒多想,結果成功了反倒讓我挺驚訝,仔細一想確實是這么一個事兒。

大家有什么想法,一起來討論呀!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM