Maison >base de données >tutoriel mysql >Jointure gauche ou jointure interne : comment une clause WHERE affecte-t-elle les résultats d'une jointure gauche ?

Jointure gauche ou jointure interne : comment une clause WHERE affecte-t-elle les résultats d'une jointure gauche ?

DDD
DDDoriginal
2025-01-03 18:53:441072parcourir

Left Join vs. Inner Join: How Does a WHERE Clause Affect a Left Join's Results?

Jointure gauche et jointure interne

En SQL, les jointures gauches et les jointures internes sont deux types de jointures fondamentaux qui génèrent des ensembles de résultats distincts. Une jointure gauche renvoie toutes les lignes de la table de gauche et fait correspondre les lignes de la table de droite en fonction d'une condition de jointure. Si aucune correspondance n'est trouvée, les valeurs manquantes dans le tableau de droite sont représentées par des valeurs NULL. En revanche, une jointure interne renvoie uniquement les lignes qui remplissent la condition de jointure, à l'exclusion des lignes des deux tables qui ne satisfont pas à cette condition.

Modification du comportement de jointure à gauche

Dans la requête SQL fournie :

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'

La présence de la clause WHERE c.foobar = 'somethingelse' après le LEFT La condition JOIN a un effet surprenant. Il semble convertir la jointure gauche en une jointure interne, ce qui entraîne le retour d'aucune ligne si « quelque chose d'autre » n'est pas présent dans la table Trois.

Explication

Cela semble étrange le comportement découle de l’ordre d’évaluation des instructions SQL. La clause WHERE est traitée une fois les jointures effectuées. Par conséquent, lorsque c.foobar = 'somethingelse' est spécifié dans la clause WHERE, il filtre efficacement toutes les lignes de la jointure gauche où c.foobar est NULL. Par conséquent, seules les lignes où c.foobar correspond à la valeur spécifiée (« quelque chose d'autre ») sont conservées dans l'ensemble de résultats final.

Solution

Pour conserver la valeur souhaitée comportement de jointure à gauche, il existe deux options :

  1. Modifier la clause WHERE pour inclure OR c.foobar IS NULL, comme indiqué ci-dessous :

    WHERE a.foo = 'something'
    AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)

    Cela permet aux lignes où c.foobar est NULL d'être incluses dans l'ensemble de résultats.

  2. Déplacez le c.foobar = comparaison 'quelque chose d'autre' dans la clause ON de la jointure gauche, garantissant que seules les lignes satisfaisant cette condition sont incluses dans le résultat ensemble :

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

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