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.
SELECT *
FROM B
WHERE NOT EXISTS (SELECT 1
FROM A
WHERE A.ID = B.ID)
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).
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
)
Ou si "NOT EXISTS" ne sont pas implémentés
SELECT *
FROM B
WHERE (SELECT count(*) FROM A WHERE A.ID = B.ID) < 1