En face de la jointure interne
Ce sera l'inverse de la jointure interne? Pour une table de la table Personne (int PersonId, varchar PersoName, int AddrId)
, je veux savoir les lignes d'une Personne avec de mauvaises AddrId
qui n'ont pas une ligne dans la Address
table.
OriginalL'auteur fastcodejava | 2010-08-06
Vous devez vous connecter pour publier un commentaire.
Une jointure EXTERNE, qui peut être de trois options:
C'est une bonne représentation visuelle des Jointures
L'aide d'une JOINTURE GAUCHE/NULL
En utilisant n'EXISTE PAS
Aide PAS DANS
Indemnités de départ: d'Accord - c'est pourquoi j'ai voté pour Thomas de réponse.
+1 Heh. Je pense que vous devriez obtenir le feu vert pour la mise en forme de fantaisie, de l'exhaustivité et de Jeff fantaisie des diagrammes de Venn.
C'est une excellente réponse, la seule chose que je voudrais ajouter (comme j'ai essayé dans mon moins de réponse globale :-P), c'est que ces méthodes ont des performances différentes implications avec le Left Join / EST NULLE étant le plus rapide en supposant que vous rejoindre sur les colonnes indexées.
Merci, mais LEFT JOIN/est NULLE EST la manière la plus rapide que sur MySQL, en supposant que les colonnes ne peuvent pas être NULL. Ce n'est pas le cas pour toute autre base de données.
OriginalL'auteur OMG Ponies
Une jointure Interne n'est pas diamétrique à une Jointure Externe. Ils servent à des fins différentes. Cependant, un modèle commun de trouver des lignes d'une table qui n'existe pas dans une autre consiste à utiliser une Jointure Externe:
Cela renvoie toutes les lignes de la table Table1 et toutes les lignes correspondantes de la Table2 de telle sorte que si un Table1 ligne n'a pas de Table2 match, un nul pour la Table2 les colonnes sont retournées. En demandant alors qu'une colonne non nullable (Table2.PrimaryKeyCol) est Nul, je vais obtenir toutes les lignes de la table Table1 qui n'existent pas dans la Table2. À l'aide de votre exemple les noms de table, nous aurions quelque chose comme:
OriginalL'auteur Thomas
Si vous considérez qu'une jointure interne comme les lignes de deux tables qui répondent à une certaine condition, puis le contraire serait les lignes de soit table qui n'en ont pas.
Par exemple le tableau suivant, sélectionnez toutes les personnes avec des adresses dans la table d'adresses:
J'imagine que le "contraire" de ce serait pour sélectionner tous les gens sans les adresses et toutes les adresses sans les gens. Cependant, cela ne semble pas être ce que vous demandez, vous semblez être intéressé par une des composantes de cette: toutes les personnes sans adresse dans la table des adresses.
Pour cela, une jointure gauche, le mieux serait de:
Remarque que, souvent, certains préfèrent écrire autrement que dans leur avis, il est plus lisible (mais dans mon expérience avec de grandes tables, il effectue pire que de la façon décrite ci-dessus):
not exists
ànot in
.OriginalL'auteur Zugwalt
Je pense que la meilleure solution serait de l'aide EXISTE. Comme ceci:
SELECT * from Personne P
OÙ P. AddrId n'EST PAS NULL
ET not EXISTS(SELECT 1 from UNE Adresse OÙ A. AddrId = P. AddrId)
La requête ci-dessus, sera de retour à chaque personne qui le AddrId est fixé, mais ne dispose pas d'un enregistrement correspondant dans la table d'Adresses.
Obs.: Utiliser la constante 1 en EXISTE de requête pour éviter d'accès à la table.
OriginalL'auteur Andre Vianna