今日、私は筆記試験で簡単なアルゴリズムの質問と簡単な 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 つほど良くない可能性があります。