Détecter l'inexistance de correspondance. Jointure ? - SQL/NoSQL - Programmation
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) |
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 :
|
La solution avec le "NOT IN" est très certainement à préférer
Marsh Posté le 31-07-2010 à 05:27:10
Nickel ca marche
Merci à vous deux
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
Marsh Posté le 03-08-2010 à 10:55:28
NOT EXISTS apporte quoi de plus que NOT IN dans ce cas ?
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
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 ?
Pourriez-vous me donner un coup de pouce ?
Merci d'avance
Message édité par Pascal le nain le 30-07-2010 à 14:26:21