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
Libérer: 2025-01-03 18:53:44
original
1079 Les gens l'ont consulté

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'
Copier après la connexion

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)
    Copier après la connexion

    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'
    Copier après la connexion

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