sql valeurs Comment sélectionner tous les enregistrements d'une table qui n'existent pas dans une autre table?




trouver valeurs d'une table n'existant pas dans une autre table (7)

table1 (identifiant, nom)
table2 (identifiant, nom)

Question:

SELECT name   
FROM table2  
-- that are not in table1 already

Voici ce qui a fonctionné le mieux pour moi.

SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID

C'était plus de deux fois plus rapide que toute autre méthode que j'ai essayée.


Ce travail aiguisé pour moi

SELECT * 
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

ou

SELECT name 
FROM table2 
WHERE NOT EXISTS 
    (SELECT * 
     FROM table2 
     WHERE table1.name = table2.name)

Voir cette question pour 3 techniques pour accomplir ceci


Je n'ai pas assez de points de rep pour voter la deuxième réponse. Mais je suis en désaccord avec les commentaires sur la première réponse. La deuxième réponse:

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

FAR est plus efficace dans la pratique. Je ne sais pas pourquoi, mais je le cours contre des records 800k + et la différence est énorme avec l'avantage donné à la 2ème réponse affichée ci-dessus. Juste mon $ 0.02



C'est la théorie des ensembles purs que vous pouvez réaliser avec l'opération minus .

select id, name from table1
minus
select id, name from table2

SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

Q : Que se passe-t-il ici?

R : Conceptuellement, nous sélectionnons toutes les lignes de la table1 et pour chaque ligne, nous essayons de trouver une ligne dans la table2 avec la même valeur pour la colonne de name . S'il n'y a pas de ligne, nous laissons la partie table2 de notre résultat vide pour cette ligne. Ensuite, nous limitons notre sélection en sélectionnant uniquement 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, de table1 ).

Bien que ce ne soit pas la méthode la plus performante possible dans tous les cas, cela devrait fonctionner dans pratiquement tous les moteurs de bases de données qui tentent d'implémenter ANSI 92 SQL.





tsql