題目來源於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
這樣就能提交成功了,剛開始也只是憑感覺試了一下沒多想,結果成功了反倒讓我挺驚訝,仔細一想確實是這么一個事兒。
大家有什么想法,一起來討論呀!