人々 (私自身も含む) は「最も重要な」または「件名」のテーブルを最初に置くのが好きなので、イベントとスコアの間の結合を最初に行い、INNER JOIN として行うことで、探しているものを達成できます。
SELECT
P.P_Id,
P.LastName,
P.FirstName,
IsNull(Sum(P.Points), 0) TotalPoints
FROM
Players P
LEFT JOIN (
Events E
INNER JOIN Scores S
ON E.Event = S.E_Id
AND E.Year = '2012'
) ON P.P_Id = S.Player
GROUP BY P.P_Id, P.LastName, P.FirstName -- no silly MYSQL implicit grouping for me!
ORDER BY TotalPoints DESC
結合順序を強制する秘訣は、実際にはそれを行う ON 句の場所であるということです。括弧を削除しても機能するはずです。しかし、余分な明快さが必須だと思うので、私はそれらを使用することを好みます.
また、INNER JOIN を最初に配置し、OUTER を最後に配置することで、結合順序を強制する完全に有効な方法でもあります。ただし、最後のテーブルを最終セットのメンバーシップを決定するテーブルにする必要があります。したがって、それを RIGHT JOIN に切り替えるとうまくいきます。
SELECT
P.P_Id,
P.LastName,
P.FirstName,
IsNull(Sum(P.Points), 0) TotalPoints
FROM
Events E
INNER JOIN Scores S
ON E.Event = S.E_Id
AND E.Year = '2012'
RIGHT JOIN Players P
ON S.Player = P.P_Id
GROUP BY P.P_Id, P.LastName, P.FirstName
ORDER BY TotalPoints DESC
異なるテーブルで PK と FK の場合に列に異なる名前を使用することは、私の考えでは、ベスト プラクティスに対する非常に悪い違反です。すべての表で「P_Id」、またはすべての表で「Player」である必要があり、一貫性がありません。