select
p.ID,
e.NAME
from
Paychecks p
inner join Employee e on p.EmployeeID = e.ID
group by
p.ID
order by
max(p.AmountPaid) desc
より論理的に見えますが、遅くなる可能性がある(テストする必要がある)別の書き方は次のとおりです。
select
e.ID,
e.NAME
from
Employee e
inner join Paychecks p on p.EmployeeID = e.ID
group by
e.ID
order by
max(p.AmountPaid) desc
数千万の行があるため、すべてのクエリの速度が遅くなることがありますが、適切なインデックスを使用すると、これは可能な限り高速になります。基本的に、Paychecks.EmployeeIDとPaychecks.AmountPaidを組み合わせた1つのインデックスが必要だと思います。また、Employee.IDのインデックスが役立つ場合があります。
結合が最終的にあなたを殺している場合は、2つのクエリを実行できます。 1つ目は、給与をEmployeeIDでグループ化し、max(PaycheckAmount)で並べ替えるだけで、2つ目は各IDの名前を取得するために使用できます。参加すると、希望よりもパフォーマンスが高くなることがあります。500人の従業員に対して1,000万の給与を受け取った場合、2つのステップで行う方が速い場合がありますが、平均して約1600年間会社で働いていることを意味します。 。;-)