Détecter l'inexistance de correspondance. Jointure ?

Détecter l'inexistance de correspondance. Jointure ? - SQL/NoSQL - Programmation

Marsh Posté le 30-07-2010 à 14:24:14    

Bonjour,
 
J'ai une table A :


id
-----
1
43
35
23
2
4
5


 
Et une table B :
 

id
----
1
3
5
456
21
43


 
Je veux récupérer tous les enregistrements de la table A dont l'id ne figure pas dans le champs id de la table B.
Par exemple ici, on récupérerait les enregistrements 35, 23, 2 et 4.
C'est assez simple, mais je vois mal comment l'implémenter.
Je pensais à une jointure, mais la jointure se base sur des correspondances, et c'est justement ce que l'on veut éviter...
Une anti-jointure alors ?  :p  
 
Pourriez-vous me donner un coup de pouce ?
 
Merci d'avance  ;)


Message édité par Pascal le nain le 30-07-2010 à 14:26:21
Reply

Marsh Posté le 30-07-2010 à 14:24:14   

Reply

Marsh Posté le 30-07-2010 à 19:16:48    

Salut
 
Tu peux tenter ceci :
 

SELECT * FROM table_a WHERE id NOT IN (SELECT id FROM table_b)


Message édité par shaoling le 30-07-2010 à 19:18:20

---------------
>> Culture-Info : La culture informatique pour tous (projet scolaire) <<
Reply

Marsh Posté le 30-07-2010 à 21:42:59    

Sinon, on peut faire une jointure avec le LEFT JOIN (qui va "lier" les lignes de la 2ème table si elles existent et mettre les champs à NULL sinon) et filtrer sur les champs à NULL.
Quelque chose du type :

Code :
  1. SELECT A.*
  2. FROM table_a
  3. LEFT JOIN table_b ON table_b.id=table_a.id
  4. WHERE b.id IS NULL


 
La solution avec le "NOT IN" est très certainement à préférer :)  

Reply

Marsh Posté le 31-07-2010 à 05:27:10    

Nickel ca marche :)
Merci à vous deux ;)


Message édité par Pascal le nain le 31-07-2010 à 05:27:18
Reply

Marsh Posté le 03-08-2010 à 09:41:24    

Le plus propre, c'est d'utiliser la clause NOT EXISTS qui est justement prévue pour ça : http://dev.mysql.com/doc/refman/5. [...] eries.html


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-08-2010 à 09:47:25    

Encore mieux, merci ;)

Reply

Marsh Posté le 03-08-2010 à 10:55:28    

NOT EXISTS apporte quoi de plus que NOT IN dans ce cas ?


---------------
>> Culture-Info : La culture informatique pour tous (projet scolaire) <<
Reply

Marsh Posté le 03-08-2010 à 11:03:06    

IN (ie NOt IN) n'est pas optimisé, c'est une instruction lente quand il y a beaucoup d'enregistrements. Après, il se peut que l'optimiseur de requête de MySQL convertisse ton NOT IN en NOT EXISTS mais c'est pas sûr. Quoi qu'il en soit, toi, tu veux savoir si un enregistrement d'une table existe (ou pas) dans une autre table, d'un point de vue sémantique, c'est EXISTS (ie NOT EXISTS) qu'il faut utiliser ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed