Maison >base de données >tutoriel mysql >Comment une clause WHERE affecte-t-elle le comportement d'un LEFT JOIN en SQL ?

Comment une clause WHERE affecte-t-elle le comportement d'un LEFT JOIN en SQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-03 20:58:43710parcourir

How Does a WHERE Clause Affect a LEFT JOIN's Behavior in SQL?

Comportement de la jointure gauche dans la clause WHERE

En SQL, une jointure gauche est destinée à inclure toutes les lignes de la table de gauche, même s'il y en a il n'y a aucune ligne correspondante dans le tableau de droite. Cependant, certaines conditions peuvent modifier ce comportement par défaut.

Considérez 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'

Dans cette requête, la jointure gauche entre tableTwo et tableThree est effectivement transformée en jointure interne en raison de la condition dans la clause WHERE, c.foobar = 'quelque chose d'autre'. En effet, la spécification d'une valeur non NULL du côté droit d'une jointure gauche (ici, 'quelque chose d'autre') dans la clause WHERE élimine toutes les lignes où la colonne correspondante est NULL, ce qui entraîne un comportement de jointure interne.

Par conséquent, la requête renvoie uniquement les lignes de tableOne et tableTwo qui ont des lignes correspondantes dans tableThree avec une valeur non NULL pour c.foobar. Pour conserver le comportement de jointure gauche souhaité, envisagez les solutions suivantes :

1. Incluez NULL dans la clause WHERE :

Remplacez la condition c.foobar = 'somethingelse' par AND (c.foobar = 'somethingelse' OR c.foobar IS NULL) pour inclure les lignes où foobar est soit ' quelque chose d'autre' ou NULL.

2. Déplacer la condition vers le prédicat de jointure :

Déplacez la condition c.foobar = 'somethingelse' de la clause WHERE vers le prédicat de jointure :

LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'

En faisant cela, la requête conserve le comportement de jointure à gauche tout en filtrant les lignes en fonction de la valeur de c.foobar.

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