由于人们(包括我自己)喜欢将“最重要”或“主题”表放在首位,因此您可以通过首先发生事件和分数之间的连接并作为 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”,并且不能不一致。