Maison > base de données > tutoriel mysql > Pourquoi ma jointure gauche agit-elle comme une jointure interne lors du filtrage sur la colonne de la table de droite dans la clause WHERE ?

Pourquoi ma jointure gauche agit-elle comme une jointure interne lors du filtrage sur la colonne de la table de droite dans la clause WHERE ?

DDD
Libérer: 2024-12-30 03:08:10
original
795 Les gens l'ont consulté

Why Does My Left Join Act Like an Inner Join When Filtering on the Right Table's Column in the WHERE Clause?

L'énigme de la jointure gauche : des heures de sorcière lorsqu'elle se transforme en une jointure interne

Dans le domaine d'un assistant de base de données, effectuer des récupérations de données complexes à l'aide de jointures gauches est une pratique courante. Cependant, parfois, la jointure gauche ne se comporte pas tout à fait comme prévu.

Imaginez la requête 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

Curieusement, lorsque la condition c.foobar est placée dans la clause WHERE comme ci-dessus, la jointure supposée gauche semble se transformer en une jointure interne. Les résultats ne sont renvoyés que si les critères a.foo et c.foobar sont remplis.

Pourquoi cette métamorphose ? La clé réside dans la clause WHERE. Lorsqu'une valeur du côté droit d'une jointure gauche (côté droit faisant référence au tableau situé à droite de la clause ON) est spécifiée dans la clause WHERE, toutes les valeurs NULL sont ignorées, réduisant ainsi la jointure gauche à une jointure interne. En termes simples, si c.foobar n'est pas présent dans la tableThree, la requête ne renvoie aucune ligne.

Pour contourner ce problème, il existe deux options :

  1. Modifier la clause WHERE à prendre en compte valeurs à la fois valides et NULL pour c.foobar :
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
Copier après la connexion
  1. Déplacez le c.foobar condition dans le prédicat de jointure :
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
Copier après la connexion

Le choix entre ces solutions dépend des exigences spécifiques de la requête. Cependant, comprendre le comportement sous-jacent des jointures gauches en présence de clauses WHERE est crucial pour maîtriser les techniques de récupération de donné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