IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Résultats incohérents avec IN et NOT IN


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier

    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 75
    Points
    75
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(*)
    FROM Toto;
    retourne 77

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*)
    FROM Toto
    WHERE Donnee IN (SELECT Base2.Table1.Donnee FROM Base2.Table1)
    retourne 69

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    A bientôt
    Guy

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Y aurait-il des 'Donnee' à NULL ?
    Fais une jointure externe ; avec 77 lignes, ce sera assez rapide d'examiner le résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    where donnee is not null
    ou utilise NOT EXISTS

  4. #4
    Membre régulier

    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 75
    Points
    75
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    A bientôt
    Guy

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/08/2014, 16h23
  2. résultats incohérants avec timediff()
    Par ajo12 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 22/12/2011, 22h32
  3. [XL-2003] Résultat formule incohérent avec calcul
    Par logiclogic dans le forum Excel
    Réponses: 2
    Dernier message: 01/06/2010, 21h17
  4. Résultat requête incohérent avec DAO
    Par ajuveneton dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/06/2007, 17h02
  5. Réponses: 5
    Dernier message: 19/11/2004, 19h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo