Tout d'abord, construisez la requête en utilisant une syntaxe JOIN explicite, plutôt que le produit cartésien. Cela ne fera probablement aucune différence sur le plan des performances pour les optimiseurs modernes, mais cela rend l'information sur la façon dont les JOIN fonctionnent plus facilement pour les programmeurs.
SELECT Player.Name, Game.Date
FROM Player
INNER JOIN Game ON Game.WinnerPlayerID = Player.PlayerID
WHERE Game.WinnerFrags > Game.TotalFrags/2
ORDER BY Player.Name
qui nous donnera tous les joueurs triés par nom qui ont prendre plus de frags dans un jeu que tous les autres joueurs dans le jeu mis en place, et les dates des jeux. Mettre les deux conditions dans le JOIN n'affectera probablement pas non plus les performances, puisque l'optimiseur fait probablement le filtrage dans le cadre de JOIN. Cela commence cependant à importer pour les JOINs GAUCHE. Disons que nous cherchons combien de jeux les dix meilleurs joueurs de la semaine ont jamais gagné de la marge décrite ci-dessus. Comme il est possible que certains d'entre eux n'en aient jamais autant spectaculairement, nous aurons besoin de LEFT JOIN.
SELECT Player.WeekRank, Player.Name, COUNT(Game.*) AS WhitewashCount
FROM Player
LEFT JOIN Game ON Game.WinnerPlayerID = Player.PlayerID
WHERE Player.WeekRank >= 10
AND Game.WinnerFrags > Game.TotalFrags/2
GROUP BY Player.WeekRank, Player.Name
ORDER BY Player.WeekRank
Eh bien, pas tout à fait. Le JOIN retournera des enregistrements pour chaque partie jouée par un joueur, ou les données de joueur et les données de jeu NULL si le joueur n'a joué à aucun jeu. Ces résultats seront filtrés, pendant ou après le JOIN en fonction de la décision de l'optimiseur, en fonction des critères de fragmentation. Cela permettra d'éliminer tous les enregistrements qui ne répondent pas aux critères de fragmentation. Il n'y aura donc pas de records à regrouper pour les joueurs qui n'ont jamais eu une victoire aussi spectaculaire. Créer efficacement une INNER JOIN .... FAIL.
SELECT Player.WeekRank, Player.Name, COUNT(Game.*) AS WhitewashCount
FROM Player
LEFT JOIN Game ON Game.WinnerPlayerID = Player.PlayerID
AND Game.WinnerFrags > Game.TotalFrags/2
WHERE Player.WeekRank >= 10
GROUP BY Player.WeekRank, Player.Name
ORDER BY Player.WeekRank
Une fois que nous déplaçons les critères frag dans la jointure de la requête se comportera correctement, le retour des dossiers pour tous les joueurs dans les dix premiers de la semaine, indépendamment du fait qu'ils ont obtenu un lait de chaux.
Après tout cela, la réponse courte est:
Pour les situations INNER JOIN il n'a probablement pas à la différence de performance où vous mettez les conditions. Les requêtes sont plus lisibles si vous séparez les conditions de jointure et de filtrage. Et obtenir une condition au mauvais endroit peut sérieusement gâcher les résultats d'un LEFT JOIN.