Vi starter med at rydde op i forespørgslen. Du bør altid prøve at udføre dine beregninger på tværs af hver række, når det er muligt, i stedet for at udføre flere lodrette underforespørgsler, da dette undgår, at DBMS'et laver flere gennemløb over den samme tabel.
SELECT ( ( (g.wbb * SUM(IF(e.event_cd =14, 1, 0))) + (g.whbp * SUM(IF(e.event_cd =16, 1, 0) )) + (g.w1b * SUM(IF(e.event_cd =20, 1, 0))) + (g.w2b * SUM(IF(e.event_cd =21, 1, 0))) + (g. w3b * SUM(IF(e.event_cd =22, 1, 0))) + (g.whr * SUM(IF(e.event_cd =23, 1, 0)))) / ( SUM(IF(e.ab_fl ='T', 1, 0)) + SUM(HVIS(e.begivenhed_cd =14, 1, 0)) + SUM(HVIS(e.sf_fl ='T', 1, 0)) + SUM(HVIS(e) .event_cd =16, 1, 0)) ) ) SOM woba FRA begivenheder e, guts g WHERE e.year_id =g.season_id OG e.pit_start_fl ='T' OG e.pit_id =start_pitcher GRUPPE EFTER g.sæson;
Hvis jeg antager, at jeg ikke har sat et komma et sted, vil dette returnere en kolonne woba
for hvert år for den angivne startkande.
Bemærk, at jeg har tilsluttet mig tabellerne på e.year_id
i stedet for SUBSTRING(e.game_ID,4,4)
; dette undgår omkostningerne ved at kalde SUBSTRING()
på hver post. Denne slags virker mindre, men det kan hurtigt lægge sig op over et stort bord.
Det burde være nok til at komme i gang.