web-dev-qa-db-fra.com

sql: vérifie si l'entrée dans la table A existe dans la table B

J'ai une table de définition que je sais n'est pas très bien maintenue, appelons ceci table A. J'ai une autre table (appelez-la table B) qui est beaucoup plus petite et devrait idéalement être un subset of table A mais je sais que table A est un peu périmé et ne contient pas de nouvelles entrées qui sont dans Table B.

Notez que les tables A et B ont des colonnes différentes.

Table A:
ID, Name, blah, blah, blah, blah

Table B:
ID, Name

Je veux toutes les lignes de la table B de sorte que l'ID de la table B n'existe pas dans la table A. Cela ne correspond pas seulement aux lignes de la table A; Je ne veux que les lignes de la table B où l'ID n'existe pas du tout dans la table A.

60
codingknob
SELECT *
FROM   B
WHERE  NOT EXISTS (SELECT 1 
                   FROM   A 
                   WHERE  A.ID = B.ID)
128
gdoron

La réponse classique qui fonctionne dans presque tous les environnements est

SELECT ID, Name, blah, blah
FROM TableB TB
LEFT JOIN TableA TA
ON TB.ID=TA.ID
WHERE TA.ID IS NULL

parfois, NOT EXISTS peut ne pas être implémenté (ne fonctionne pas).

21

Si vous utilisez EXISTS, vous pouvez utiliser les éléments ci-dessous dans SQL Server:

SELECT * FROM TableB as b
WHERE NOT EXISTS
(
   SELECT * FROM TableA as a
   WHERE b.id = a.id
)
13
Abe Miessler

Ou si "NOT EXISTS" ne sont pas implémentés

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
0
Daflanck