I ran this query (returning all the columns) and it looks like the roster table has a record for each year. If a pitcher played for 4 years, 4 rows will be returned. The GROUP BY that was suggested works well. Another option would be the 'ID' table may be better since there is only one record for each player.
SELECT games.game_id, id.last FROM games
JOIN id ON id.ID = games.home_start_pit_id
WHERE games.game_dy = "WEDNESDAY" AND games.AWAY_TEAM_ID = "BOS";
When I run into what I think is a join issue, I like to look at the data to find out what is different. That usually identifies a column that needs to be in the join. Although in this case extracting the year from the game_id, casting it to a date and then joining it with the year column in the roster table is kind of a pain.
Coming up with odd questions that can be answered with a query is fun!