106 votes

Vérifiez 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 entretenue, appelons-la table A. J'ai une autre table (appelée table B) qui est beaucoup plus petite et idéalement devrait être un sous-ensemble de table A mais je sais que table A est un peu obsolète et ne contient pas les nouvelles entrées qui sont dans Table B.

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

Table A:
ID, Nom, blah, blah, blah, blah

Table B:
ID, Nom

Je veux toutes les lignes de la Table B telles que l'ID dans la Table B N'EXISTE PAS dans la Table A. Cela ne correspond pas seulement aux lignes de la Table A; je veux seulement les lignes de la Table B où l'ID n'existe pas du tout dans la Table A.

208voto

gdoron Points 61066
SÉLECTIONNER *
DE    B
OÙ    NOT EXISTS (SÉLECTIONNER 1 
                   DE    A
                   OÙ   A.ID = B.ID)

20 votes

sélectionner * de TableB b où b.ID not in (sélectionner a.ID de TableA a)

2 votes

@vakio Merci pour la question. Vous devriez certainement mettre votre commentaire sous forme de réponse.

0 votes

@AnalyticalMonk J'espère que vous êtes conscient que c'est exactement la même requête qui produira exactement les mêmes résultats. Juste une légèrement différente syntaxe, c'est tout.

39voto

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 pas fonctionner).

3 votes

Cette requête est plus efficace que SELECT * FROM B WHERE NOT EXISTS (SELECT 1 FROM A WHERE A.ID = B.ID)

0 votes

Le DUAL est une table spéciale d'une ligne et d'une colonne présente par défaut dans toutes les bases de données Oracle. Le propriétaire de DUAL est SYS (SYS possède le dictionnaire de données, donc DUAL fait partie du dictionnaire de données), mais DUAL peut être accédé par tous les utilisateurs. La table a une seule colonne VARCHAR2(1) appelée DUMMY qui a une valeur de 'X'. MySQL permet que DUAL soit spécifié comme une table dans des requêtes qui n'ont pas besoin de données provenant de n'importe quelle table. Dans SQL Server, la table DUAL n'existe pas, mais vous pourriez en créer une.

2 votes

Plus rapide que NOT EXISTS

15voto

Abe Miessler Points 34869

Si vous êtes déterminé à utiliser EXISTS, vous pouvez utiliser ce qui suit dans SQL Server :

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

9voto

Kai Dong Points 61

Ceci fonctionne aussi

SELECT *
FROM tableB
WHERE ID NOT IN (
  SELECT ID FROM tableA
);

0 votes

J'ai aimé celui-ci! Très direct et facile à comprendre

0voto

Daflanck Points 1

Ou si les "NOT EXISTS" ne sont pas mis en œuvre

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X