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
DDDoriginal
2024-12-30 03:08:10809parcourir

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';

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)
  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'

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!

Déclaration:
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