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

Développement SQL Server Discussion :

resultat inattendu de "not in avec s/requête"


Sujet :

Développement SQL Server

  1. #1
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut resultat inattendu de "not in avec s/requête"
    Salut
    Voici une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tpersonne(idpersonne int identity primary key,
    idpere int foreign key references tpersonne(idpersonne), --le père en auto jointure
    idmere int foreign key references tpersonne(idpersonne),--la mère en auto jointure 
    prenom varchar(20), prenom varchar(20))
    Nous avons copier/coller des données depuis une table access. Il existe des personnes avec parents renseignés.
    Nous voulons chercher les personnes n'ayant pas d'enfant. voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select idpersonne, prenom, nom 
       from tpersonne
    where idpersonne not in
    (select idpere from tpersonne as papa union all select idmere from tpersonne as maman)
    ...elle ne marche que si on remplace...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    idpere et idmere par isnull(idpere,0) et isnull(idmere,0)
    ...dans les sous-requêtes.
    Je voudrais comprendre pourquoi ce comportement? sachant que...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select idpere from tpersonne as papa union all select idmere from tpersonne as maman
    ...pris à part donne bien des données.
    Merci d'avance
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Parce que vous devez avoir des NULL dans vos idpere et idmere, et que l'expression NOT IN (..., null) est toujours fausse.

    Vous pouvez donc soit exclure les nulls lors de la sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT idpersonne, prenom, nom 
      FROM tpersonne
     WHERE idpersonne NOT IN (SELECT idpere
                                FROM tpersonne AS papa
                               WHERE idpere is not null
                               union ALL
                              SELECT idmere
                                FROM tpersonne AS maman
                               WHERE idmere is not null)
    Soit préférer une requête de non-existence (qui se rapproche plus de votre besoin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT per.idpersonne, per.prenom, per.nom 
      FROM tpersonne as per
     WHERE NOT EXISTS (SELECT null
                         FROM tpersonne AS par
                        WHERE per.idpersonne IN (par.idpere, par.idmere))

  3. #3
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Merci
    C'est bien ce que je soupçonnait. Mais dan le doute...
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

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

Discussions similaires

  1. Problème IN / NOT IN avec une requête Access
    Par torobravo dans le forum IHM
    Réponses: 3
    Dernier message: 21/01/2010, 22h00
  2. [Tableaux] souci avec des simples quotes
    Par Jean Fi dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2006, 20h13
  3. Opérateur not ? Bug avec MinGW 3.4 ? ou mot clé ?
    Par Groove dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 31/01/2005, 18h05

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