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
Een andere manier van schrijven, die er logischer uitziet, maar misschien langzamer is (je zou moeten testen), is:
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
Met tientallen miljoenen rijen groeit elke zoekopdracht soms traag, maar met de juiste indexen gaat dit zo snel als maar kan. Ik denk dat je eigenlijk één index nodig hebt op Paychecks.EmployeeID en Paychecks.AmountPaid gecombineerd. En index op Employee.ID kan helpen.
Als de join je uiteindelijk doodt, kun je twee query's uitvoeren. De eerste gebruikt alleen de loonstrookjes om ze te groeperen op EmployeeID en te ordenen op max (PaycheckAmount), en een tweede kan worden gebruikt om de namen voor elke ID op te halen. Soms kost deelname meer prestaties dan je zou willen, en als je 10 miljoen salaris krijgt voor 500 werknemers, is het misschien sneller om het in twee stappen te doen, hoewel het betekent dat ze gemiddeld ongeveer 1600 jaar bij het bedrijf werken .;-)