2009-07-03 9 views
0
**Table A** 
1 
2 
3 
4 
5 
6 


**Table B** 
2 
3 
5 

Comment puis-je sélectionner les ID d'entrée qui existent uniquement dans le tableau B? Dans cet exemple, je suis à la recherche d'une requête qui renvoie 1, 4 et 6.MySQL - Comment obtenir une liste de valeurs dans le tableau A qui n'existent pas dans le tableau B?

+0

quelles sont ces valeurs? ids? fournir la structure de la table nous faciliterait la tâche –

+0

Désolé, oui, ce sont des identifiants. Au départ, j'avais fourni plus d'informations, mais je pensais que je ne réduirais que les bits pertinents. Apparemment, je suis allé trop loin. – Eileen

Répondre

2

en supposant que la colonne est nommé 'id', soit:

SELECT * 
FROM tableA a 
WHERE NOT EXISTS (SELECT 1 FROM tableB WHERE id = a.id) 

ou

SELECT * 
FROM TableA 
WHERE id NOT IN (SELECT id FROM tableB) 

Vous aurez probablement besoin de tester pour voir ce qui fonctionne mieux. MySQL peut être un peu imprévisible.

+0

Ah, c'est parfait! Merci! La performance n'est pas un problème ici car il s'agit d'une requête unique. – Eileen

2

Essayez

select value from B where value not in (select value from A) 

pour obtenir des valeurs de B qui ne sont pas dans A.

Pour obtenir le opposées (valeurs en A non B) utilisent

select value from A where value not in (select value from B) 
+0

Je serais très curieux de voir comment cela fonctionne contre la réponse fournie. Ma première pensée était de répondre avec ce qu'il a écrit mais cela ne serait-il pas plus rapide? Mmm. –

+0

Si la table B peut contenir des valeurs NULL, NOT IN est un outil dangereux, voir http://stackoverflow.com/questions/129077/sql-not-in-constraint-and-null-values ​​Envisagez d'utiliser NOT EXISTS. – Andomar

0

Cela évite IN + sous-requête:

SELECT A.value FROM A 
LEFT OUTER JOIN B ON (A.value = B.value) 
WHERE B.value IS NULL 

Parce que IN (subquery) isn't optimized comme il est exécuté pour chaque ligne trouvée dans le tableau A

+0

Cela revient à l'optimiseur de requête. Par exemple, Sql Server exécutera les deux requêtes de la même manière. – Andomar

+0

Oui, mais la question étant pour mysql, il est dit dans le doc que cette requête est (encore en 6.0 apparemment) gâchée par l'optimiseur. –

Questions connexes