Maison > base de données > tutoriel mysql > Jointures gauches et clauses WHERE : comment interagissent-elles et comment puis-je éviter des résultats inattendus ?

Jointures gauches et clauses WHERE : comment interagissent-elles et comment puis-je éviter des résultats inattendus ?

DDD
Libérer: 2024-12-31 18:05:12
original
993 Les gens l'ont consulté

Left Joins and WHERE Clauses: How Do They Interact, and How Can I Avoid Unexpected Results?

Les bizarreries des jointures gauches et des clauses WHERE

Lors de l'exécution d'opérations de récupération de données, les développeurs utilisent souvent des jointures gauches pour combiner les informations de plusieurs tables. Cependant, un piège courant survient lors de l'utilisation d'une clause WHERE en conjonction avec une jointure gauche, transformant potentiellement le comportement de la jointure gauche.

Considérez l'instruction SQL suivante :

SELECT
a.foo
b.bar
c.foobar
FROM tableOne AS a
INNER JOIN tableTwo AS b ON a.pk = b.fk
LEFT JOIN tableThree AS c ON b.pk = c.fk
WHERE a.foo = 'something'
AND c.foobar = 'somethingelse'
Copier après la connexion

Intuitivement, on pourrait attendez-vous à ce que cette instruction effectue une jointure gauche entre tableThree et tableTwo, en spécifiant une condition de filtre pour c.foobar. Cependant, la présence de la clause WHERE contenant c.foobar = 'somethingelse' modifie par inadvertance les caractéristiques de la jointure gauche.

Lorsqu'une valeur du côté droit d'une jointure gauche (dans ce cas, c.foobar) est incluse dans la clause WHERE, seules les lignes dont la valeur est NOT NULL sont incluses dans le jeu de résultats. Ainsi, la jointure gauche se comporte effectivement comme une jointure interne, éliminant toutes les lignes avec des valeurs NULL pour c.foobar.

Pour préserver le comportement prévu de la jointure gauche dans l'exemple ci-dessus, on peut utiliser l'une des méthodes suivantes approches :

  • Réécrivez la clause WHERE : Remplacez c.foobar = 'somethingelse' par une condition qui permet Valeurs NULL, telles que AND (c.foobar = 'somethingelse' OR c.foobar IS NULL).
  • Déplacez le filtre dans le prédicat de jointure : Modifiez la clause LEFT JOIN comme suit : LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'quelque chose d'autre'. En plaçant le filtre dans la jointure elle-même, le comportement de la jointure gauche reste inchangé, car les valeurs NULL dans c.foobar sont toujours conservées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal