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

MS SQL Server Discussion :

sous-requête avec not null


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 53
    Points : 43
    Points
    43
    Par défaut sous-requête avec not null
    Bonjour à tous,
    J'ai une requête très simple dont je ne comprends pas le résultat: j'ai 2 tables, la première "extrait" contient environ 5.000 lignes. La 2ème "total" contient environ 7 millions de lignes, dont 1.7 million non nulles. Les 2 sont liées par leur champs "ID", clé primaire dans extrait, champs classique chez total. Pour info, je sais que 10 extrait.id ne sont pas dans total.

    Je veux juste voir parmi "extrait" les clés que je ne trouve pas dans total, j'ai donc tout simplement écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select e.*
    from extrait e
    where e.ID not in (
    	select t.ID from total t)
    Mais cela ne fonctionne pas!! ça ne me renvoie aucun résultat! Pour avoir le bon résultat, je dois rajouter une clause not null à la sous-requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select e.*
    from extrait e
    where e.ID not in (
    	select t.ID from total t
            where t.ID is not null)
    Je ne comprends pas du tout en quoi cette clause change quelque chose!! Quelqu'un a un explication?

    Pour info, les deux requêtes suivantes me donnent les bons résultats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    select e.*
    from extrait e	
    	left outer join total t on t.ID = e.ID
    where t.ID is null 
    -- >> je trouve les 10 résultats attendus
     
    select e.*
    from extrait e
    where not exists (select null from total t where t.ID = e.ID)
    -- >> je trouve les 10 résultats attendus
    Merci à tous

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    e.ID NOT IN (SELECT t.ID FROM total t) est vrai si et seulement si e.ID est différent toutes les t.ID de la sous requête.
    Or, si votre sous requête contient des NULL, le prédicat ne peut être vrai, puisque e.ID <> NULL n'est pas vrai.
    En effet :
    - NULL n'est égal à rien
    - NULL n'est différent de rien

    Voyez NULL comme "inconnu" plutôt que comme "rien/vide" comme on a tendance à le faire naturellement, et tout deviendra logique.
    "inconnu", c'est d’ailleurs le résultat de e.ID NOT IN (SELECT t.ID FROM total t) dans votre cas.

  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
    Pour compléter ce qu'a dit aieeeuuuuu, regardez le tableau de logique tri-valuée proposé par wikipedia.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    ok super, merci pour toutes ces explications c'est très clair!
    bonne journée

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

Discussions similaires

  1. Une sous-requête avec NOT IN qui me cause du souci
    Par annedeblois dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/09/2008, 14h56
  2. Sous-requêtes avec IN et NOT IN
    Par angebe dans le forum SQL
    Réponses: 6
    Dernier message: 28/09/2007, 11h59
  3. Requête et sous requête avec SELECT et UPDATE
    Par Véronique75ca dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/06/2006, 21h25
  4. [PHPMyAdmin]Problème avec "Not Null" dans mysql 5
    Par Ryan Sheckler dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/12/2005, 14h45
  5. Requète avec NOT EXISTS
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 15h20

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