sql を使用して、部門で最も給与の高い従業員情報をクエリします (3 つのソリューション)

今日、私は筆記試験で簡単なアルゴリズムの質問と簡単な sql の質問をしました. sql の質問の主なアイデアは、従業員テーブルと部門テーブルの 2 つのテーブルがあり、関連するフィールドは部門 ID であるということです.部署ごとに最も給​​与の高い社員の情報を探す 複数人で全てのアウトプットが必要

解決策 1

あの時は解決策しか思い浮かばなかった

最初にサブクエリを使用して各部門の最高給与を見つけ、次に部門 ID を使用して従業員テーブルを部門テーブルに関連付け、最後に部門の最高給与を使用してフィルタリングします。完全な SQL は次のとおりです。

select d.name Department, e.name as Employee, e.salary as Salary
from Employee e left join Department d on e.departmentId = d.id
where (departmentId, salary) in (
  select departmentId, max(salary)
  from Employee
  group by departmentId
);

解決策 2

後でインターネットで別の解決策があることを知り、それはかなり独創的だと思ったので、それを学びました。全体的な考え方はソリューション 1 と同じですが、2 つのフィールドの in 操作が 1 つのフィールドに置き換えられ、親子クエリの部門 ID がフィルター条件としてサブクエリに配置されます。

select d.name Department, e.name as Employee, e.salary as Salary
from Employee e left join Department d on e.departmentId = d.id
where salary in (
  select max(salary)
  from Employee emp 
  where e.departmentId = emp.departmentId
);

解決策 3

解決策1と解決策2を踏まえて、新しい解決策を考えました.従業員テーブル部門の最高給与のサブクエリ結果を一時テーブルとして使用し、従業員テーブルと部門テーブルの関連付けに追加しました. 3つのテーブル間の接続を形成し、最終的に従業員と一時テーブルを使用しました.テーブルの給与比較は結果を得ることができます

select d.name Department, e.name as Employee, e.salary as Salary
from Employee e 
left join Department d on e.departmentId = d.id
left join  (
  select departmentId, max(salary) as max_salary
  from Employee emp 
  group by emp.departmentId
) as temp
on temp.departmentId = e.departmentId
where e.salary >= temp.max_salary;

3 つのアルゴリズムの効率比較

理論的には、ソリューション 1 とソリューション 3 の効率はほぼ同じであり、ソリューション 2 よりも効率が高くなります。解決策 1 と解決策 3 により、サブクエリは 1 回だけ実行する必要がありますが、解決策 2 では、employee テーブル レコードの各行をサブクエリに関連付ける必要があるため、効率は他の 2 つほど良くない可能性があります。

参照: sql - 部門で最も高給の従業員

おすすめ

転載: blog.csdn.net/qq_41767116/article/details/129341965