table1 (id, nom) table2 (id, nom)
Requête :
SELECT name
FROM table2
-- that are not in table1 already
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Q : Qu'est-ce qui se passe ici ?
A : Conceptuellement, nous sélectionnons toutes les lignes de table1
et pour chaque ligne nous essayons de trouver une ligne dans table2
avec la même valeur pour la colonne name
. S'il n'y en a pas, nous laissons la partie table2
de notre résultat vide pour cette ligne. Ensuite, nous limitons notre sélection en ne retenant que les lignes du résultat où la ligne correspondante n'existe pas. Enfin, nous ignorons tous les champs de notre résultat à l'exception de la colonne name
(celle dont nous sommes sûrs qu'elle existe, dans table1
).
Bien que cette méthode ne soit pas la plus performante dans tous les cas, elle devrait fonctionner dans tous les moteurs de base de données qui tentent d'implémenter [ANSI 92 SQL][1].
Vous pouvez soit faire
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
ou
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Voir [cette question][1] pour 3 techniques permettant d'accomplir ceci