Pourquoi INNER JOIN n'est pas égal (! =)
Lorsque j'exécute la requête suivante:
SELECT * FROM `table1`
INNER JOIN table2 ON table2.number = table1.number
- Je obtenir le résultat en moins de 2 secondes. Il y a environ 6 millions de dossiers dans table2
et 1 million de disques dans table1
table2.number
et table1.number
sont indexés.
Maintenant je veux obtenir une liste de nombres qui n'existent pas. Comme ceci:
SELECT * FROM `table1`
INNER JOIN table2 ON table2.number != table1.number
Cela prend-il pour toujours et toujours suspendu.. Comment pour résoudre ce problème?
source d'informationauteur I'll-Be-Back
Vous devez vous connecter pour publier un commentaire.
Disons que votre première
INNER JOIN
retourne 75% des 1 000 000 de lignes danstable1
. La deuxième requête ne retourne pas les 250 000 autres lignes que vous le pensez. Au lieu de cela, il tente de créer un produit Cartésien et supprimer les 750 000 lignes correspondantes. Ainsi, il essaie de retourner à 6 000 000×1 000 000 d'-de 750 000 lignes. C'est un renflement 6×1012 ligne jeu de résultats.Vous voulez probablement à ceci:
Cela renvoie des lignes dans
table1
n'est pas présent danstable2
.Vous pourriez également être intéressé par
FULL OUTER JOIN
:Cela renvoie des lignes dans les deux tables qui n'ont pas un match sur l'autre table.
La raison pour laquelle ce n'est pas le travail, c'est la cause de votre basiclly de rejoindre à chaque ligne de la table table1 avec chaque ligne avec le tableau 2. Vous avez besoin de quelque chose à continuent à se joindre à elle. La meilleure façon de faire cela est de faire une jointure gauche (Sens il va rejoindre table1 n'importe quoi, mais pas table2), puis assurez-vous il n'y a pas une entrée pour table2 avec la valeur est null. Vous devrez ensuite faire la même chose pour table2.
Au lieu de cela, vous pouvez utiliser cette méthode:
SÉLECTIONNEZ * À PARTIR DE
table1
LEFT JOIN table2 SUR la table2.nombre = table1.nombre
OÙ table2.nombre est NUL OU table1.nombre est NUL