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

Langage SQL Discussion :

Requêtes similaires ne donnant pas le même résultat


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut Requêtes similaires ne donnant pas le même résultat
    Bonjour!

    Je rencontre une chose curieuse en SQL:
    La requête suivante ne donne aucun résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM T_NANFR 
    where T_NANFR.NAN_ID_N NOT IN (SELECT T_STATION_FIXE.NAN_ID_N FROM T_STATION_FIXE)
    NAN_ID_N est la clé primaire de T_NANFR et elle est une FK dans T_STATION_FIXE

    En revanche cette requête (qui est la même):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM T_NANFR 
    where T_NANFR.NAN_ID_N NOT IN (SELECT T_NANFR.NAN_ID_N FROM  T_NANFR WHERE T_NANFR.NAN_ID_N IN (SELECT T_STATION_FIXE.NAN_ID_N FROM T_STATION_FIXE))
    retourne 2000 résultats environ...

    Je ne comprends pas pourquoi la première requête n'a pas fonctionné...

    Auriez-vous svp une explication à cela?

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,

    La colonne NAN_ID_N qui est clé étrangère ne contient pas forcément toutes les valeurs contenues en tant que clé primaire.

    Un exemple pour concretiser ça :

    Table T_NANFR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NAN_ID_N | libelle
    1        | rouge
    2        | bleu
    3        | jaune
    4        | rose
    5        | vert
    Table T_STATION_FIXE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Nom | NAN_ID_N
    a   | 1
    b   | 1
    c   | 2
    d   | 5
    e   | 4
    f   | 4
    Ainsi ta première requête ne te renverra pas le même résultat que la deuxième car NAN_ID_N = 3 n'apparait pas en tant que clé étrangère.
    Donc tes requêtes ne sont pas les mêmes.

    Tu devrais essayer de remplacer tes IN et NOT IN par des jointures...

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous avez probablement des valeurs nulles dans votre liste.
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
      FROM T_NANFR 
     WHERE NAN_ID_N NOT IN (SELECT NAN_ID_N
                              FROM T_STATION_FIXE
                             WHERE NAN_ID_N IS NOT NULL)
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
      FROM T_NANFR
     WHERE NOT EXISTS (SELECT NULL
                         FROM T_STATION_FIXE
                        WHERE T_STATION_FIXE.NAN_ID_N = T_NANFR.NAN_ID_N)

  4. #4
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut
    Je vous remercie Waldar!
    La première requête avec l'ajout du "not null" fonctionne maintenant!

    Je te remercie Lola mais c'était bien deux fois la même requête que j'avais écrit:
    L'objectif des deux requêtes était de récupérer dans la liste justement complète de la primary key les éléments qui ne sont pas dans la Foreign Key de T_STATION_FIXE (les éléments non liés à des éléments fils).

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/01/2015, 13h45
  2. Réponses: 1
    Dernier message: 25/08/2012, 15h50
  3. Requête ne donnant pas le bon résultat !
    Par Titiii25 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/03/2010, 14h56
  4. Réponses: 6
    Dernier message: 11/11/2007, 17h34
  5. Le style CSS ne donne pas le même résultat entre IE7 et Firefox
    Par beegees dans le forum Mise en page CSS
    Réponses: 13
    Dernier message: 21/09/2007, 15h32

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