С тех пор, как люди (включая меня) хотели бы поставить «самую важную» или «тематическую» таблицу в первую очередь, вы можете выполнить то, что вы ищете, сделав сначала соединение между событиями и результатами, и как 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
хитрость о обеспечении порядка соединения является то, что на самом деле это расположение пункта о том, что это делает, вы можете удалить скобки, и он должен работать. Но я предпочитаю использовать их, потому что я думаю, что дополнительная ясность - это необходимость.
Это также вполне эффективный способ принудительного исполнения заявки на вступление, сначала вставляя ваши ВХОДНЫЕ ПРИСОЕДИНЯЯ, а ВЕРСИЯ - последним. Только, вы хотите, чтобы последняя таблица была той, которая диктует членство в конечном наборе. Так переключая его 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» во всех таблицах и не быть непоследовательным.
Я предполагаю, что это MySQL, поскольку никакая другая СУБД не позволит этой ужасной «GROUP BY» и агрегации? – JNK
Мои плохие, исправленные :-) –