6
votes

Le placement d'une condition est-il important?

Les 2 requêtes suivantes me donnent des résultats différents: xxx

et xxx

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?


0 commentaires

3 Réponses :


1
votes

Le premier indiquera que vous ne correspondez que des enregistrements correspondants de B qui ont également une valeur de null pour défaut .

La deuxième variante vous montrera tous les enregistrements de B , car le filtre est appliqué après l'exécution de la jointure extérieure est exécutée. Comme les enregistrements inégalés apparaissent avec des valeurs null , ceci correspond à tous les enregistrements.

Cependant, vous devez également savoir que lorsque vous filtrez sur la table joindre ED dans la clause vous forçageez une jointure intérieure , alors vous avez réellement deux problèmes au travail ici.


0 commentaires

0
votes

Pas exactement, mais dans ce cas oui.

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.

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.

Enfin, car la clause d'où filtre la clause, la jointure gauche garde au moins une ligne avec la condition dans la clause ON, mais jetez-la avec la condition de la clause WHERE.


1 commentaires

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?



3
votes

Ils sont et doivent être différents.

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.

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.

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.

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.


0 commentaires