Les 2 requêtes suivantes me donnent des résultats différents: et p> J'avais supposé que la condition fait la même opération sur les deux requêtes, seulement à des moments différents. Est-ce que je manque quelque chose? P> p>
3 Réponses :
Le premier indiquera que vous ne correspondez que des enregistrements correspondants de B qui ont également une valeur de La deuxième variante vous montrera tous les enregistrements de Cependant, vous devez également savoir que lorsque vous filtrez sur la table code> joindre code> ED dans la clause null code> pour
défaut code>. p>
B code>, car le filtre est appliqué après l'exécution de la jointure extérieure code> est exécutée. Comme les enregistrements inégalés apparaissent avec des valeurs code> null code>, ceci correspond à tous les enregistrements. P>
où code> vous forçageez une jointure intérieure code> code> , alors vous avez réellement deux problèmes au travail ici. P>
Pas exactement, mais dans ce cas oui. p>
La clause d'où filtre le jeu de résultats, alors que la clause sur la clause arrête des rangées de joints en premier lieu. L'ensemble de résultats pourrait être important, gagner beaucoup de travail dans la manipulation de la grande série de résultats. Si vous deviez rejoindre d'autres tables, cela ferait une grande différence, car l'arrêt des lignes rejoignant plus tôt peut couper des quantités massives de lignes plus tard. P>
La plupart des analyseurs modernes optimiseront toutefois la requête, de sorte que l'effet de performance devrait être identique de la même manière. P>
Enfin, car la clause d'où filtre la clause, la jointure gauche garde em> au moins une ligne avec la condition dans la clause ON, mais jetez-la avec la condition de la clause WHERE. P >
C'est ca le truc. J'ai d'autres jointures dans ma requête réelle et il y a une grande différence notable. Mais le premier cas donne plus de cas que la seconde. Intuitivement, comme vous l'avez dit, ne devrait-il pas être l'inverse?
Ils sont et doivent être différents. P>
Considérez le cas où vous avez un A avec un B qui correspond sur le marchand et l'Agendend ID's et B.default n'est pas NULL. p>
Dans le premier cas, vous trouverez l'A, puis ne trouverez aucun B qui répondra aux critères, car il n'y a pas de B qui correspond à l'identifiant et que la valeur par défaut est NULL. Mais parce que c'est une jointure gauche, vous obtenez toujours un enregistrement avec les données "A" dans la sortie. P>
Dans le second cas, vous trouverez l'A et trouvez une correspondance b. Mais parce que B échoue de la clause WHERE, l'enregistrement est exclu de la sortie. P>
Si vous faites une jointure complète, placez une condition dans un élément par rapport à un lieu où ne changera pas la sortie. Mais à gauche ou à droite, il change la sortie de la manière dont j'ai essayé de décrire ci-dessus. P>