Sont le SQL concepts JOINTURE EXTERNE GAUCHE et OÙ n'EXISTE PAS fondamentalement les mêmes?
Quoi la différence entre l'utilisation d'un LEFT OUTER JOIN
, plutôt qu'une sous-requête qui commence avec une WHERE NOT EXISTS (...)
?
Il y a tellement de différences avec ces concepts, mais pour commencer une sous-requête exécutera une par ligne de la table primaire, un
Dans SQL Server où n'existe pas est implémenté comme un anti semi join et peut utiliser hachage, de fusion, ou de boucles imbriquées. Exactement le même physique opérateur de jointure choix LOJ, mais potentiellement plus efficace, évite de dupes.
J'ai compris la question comme une sous-requête sur la
LEFT JOIN
ne sera pas....Dans SQL Server où n'existe pas est implémenté comme un anti semi join et peut utiliser hachage, de fusion, ou de boucles imbriquées. Exactement le même physique opérateur de jointure choix LOJ, mais potentiellement plus efficace, évite de dupes.
J'ai compris la question comme une sous-requête sur la
SELECT
, quelque chose comme SELECT a, (SELECT b FROM table WHERE NOT EXISTS ...)
, mais sur un deuxième coup d'œil, il semble que j'ai compris de la mauvaise façonOriginalL'auteur Steffan Harris | 2012-03-19
Vous devez vous connecter pour publier un commentaire.
Non, ils ne sont pas la même chose, car ils pas retour le même ensemble de lignes dans la plus simpliste de cas d'utilisation.
La
LEFT OUTER JOIN
renvoie toutes les lignes de la table de gauche, où les deux lignes existent dans la table liée et où ils ne le sont pas. LeWHERE NOT EXISTS()
sous-requête ne retourne que les lignes où la relation n'est pas remplie.Toutefois, si vous avez un
LEFT OUTER JOIN
et cherchéIS NULL
sur la colonne de clé étrangère dans laWHERE
clause, vous pouvez faire l'équivalent de comportement à l'WHERE NOT EXISTS
.Par exemple:
Est équivalent à ceci:
Mais celui-ci est pas équivalent:
Il retourne des lignes de
t_main
à la fois avoir et ne pas avoir des lignes connexes danst_related
.Note Ce n'est pas parler de la manière dont les requêtes sont compilés et exécutés, ce qui est différent: ce n'aborde qu'une comparaison des ensembles de lignes de retour.
LEFT OUTER JOIN
renvoie toutes les lignes à partir de la gauche de la table; il est possible qu'il y a de lignes dans la table de droite, qui ne sera pas retourné.excellente explication !\
OriginalL'auteur Michael Berkowski
Que Michael déjà répondu à votre question voici un petit exemple pour illustrer la différence:
Jointure externe gauche:
Résultat:
EXISTE utilisation:
Existe Pas Dans:
Résultat:
C'est sûr, utilisé le
*
car il points de la deuxième différence (moins de colonnes retournées) vraiment bienOriginalL'auteur ntziolis
Jointure externe gauche est plus souple que celui où n'existe pas. Vous devez utiliser une jointure externe gauche si vous voulez retourner à l'une des colonnes de la table enfant. Vous pouvez également utiliser la jointure externe gauche pour retourner les enregistrements qui correspondent à la table parent ainsi que tous les enregistrements dans la table parent qui n'ont pas de correspondance. Où n'existe pas seulement vous permet de renvoyer les enregistrements sans correspondance.
Toutefois, dans le cas où ils ne le sont de retour l'équivalent des lignes et vous n'avez pas besoin de toutes les colonnes dans le tableau de droite, alors où est susceptible d'être le plus performant choix (au moins dans SQL server, je ne sais pas pour les autres dbs).
LEFT OUTER JOIN
peut toujours être remplacé parRIGHT OUTER JOIN
), je dois vraiment vous chercher sur votre utilisation du mot "doit" 🙂 jointure Externe est une sorte d'union, réalisée par un rembourrage de une/deux tableaux avec des valeurs null pour satisfaire à l'exigence habituelle de l'union. Par conséquent, le même effet peut être effectuée dans SQL à l'aide deUNION
avec un autre type de jointure (intérieure, naturel, etc).OriginalL'auteur HLGEM
Je soupçonne que la réponse est en fin de compte, les deux sont utilisés (entre autres constructions) pour effectuer l'opération relationnelle
antijoin
en SQL.OriginalL'auteur onedaywhen