Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/01/2011, 17h02   #1
Invité de passage
 
Guy Marty
Inscription : janvier 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Guy Marty

Informations forums :
Inscription : janvier 2011
Messages : 3
Points : 1
Points : 1
Par défaut Résultats incohérents avec IN et NOT IN

Bonne année,

J'ai des soucis de résultats qui me paraissent incohérents avec IN ou NOT IN : (j'ai changé les noms des tables et des champs)

Code :
1
2
SELECT COUNT(*)
FROM Toto;
retourne 77

Code :
1
2
3
SELECT COUNT(*)
FROM Toto
WHERE Donnee IN (SELECT Base2.Table1.Donnee FROM Base2.Table1)
retourne 69

Code :
1
2
3
SELECT COUNT(*)
FROM Toto
WHERE Donnee NOT IN (SELECT Base2.Table1.Donnee FROM Base2.Table1)
devrait retourner 77-69 soit 8 or il retourne 0

Auriez-vous une idée sur ce qui se passe ?

Par avance, je vous remercie de vos réponses.
Je vous présente mes meilleurs vœux pour 2011.
Guy
Guy_M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 17h32   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Y aurait-il des 'Donnee' à NULL ?
Fais une jointure externe ; avec 77 lignes, ce sera assez rapide d'examiner le résultat.
Code :
1
2
3
SELECT t1.Donnee, t2.Donnee
FROM Toto AS t1
LEFT OUTER JOIN Base2.Table1 AS t2 ON t2.Donnee = t1.Donnee
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 21h46   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
C'est le principe de la logique ternaire, ou en français moins détaillé.

NULL n'est égal à rien pas même à NULL, c'est juste indéfini, donc X = NULL renvoie UNKNOWN.
x in (y,z) <=> x=y OR x=z
x not in (y,z) <=> x!=y AND x!=z

Rajoute dans la sous requête un
Code :
WHERE donnee IS NOT NULL
ou utilise NOT EXISTS
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 10h07   #4
Invité de passage
 
Guy Marty
Inscription : janvier 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Guy Marty

Informations forums :
Inscription : janvier 2011
Messages : 3
Points : 1
Points : 1
C'était bien un problème de NULL dans la sous requête (je savais qu'il y avait un NULL mais je ne lui avait pas attribué mon problème).

Je ferais donc attention, NULL n'est pas vide.

J'ai réécrit la requête ainsi
Code :
1
2
3
4
5
6
SELECT COUNT(*)
FROM Toto
WHERE Donnee NOT IN
                (SELECT Base2.Table1.Donnee
                 FROM Base2.Table1
                 WHERE Base2.Table1.Donnee IS NOT NULL)
et obtenu le résultat que j'attendais.

Je vous remercie de vos réponses.
Guy
Guy_M est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h00.


 
 
 
 
Partenaires

Hébergement Web