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 :

Requête simple et pourtant résultat fort étrange [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut Requête simple et pourtant résultat fort étrange
    Bonjour à tous,
    j'ai voulu faire une requete toute simple pour me confirmer un resultat, et pourtant le resultat est illogique

    j'ai une table de taches avec un code de tache et un code projet
    aucune unicité sur les champs

    je veux tous les projets qui n'ont pas de code tache = 0

    j'ai donc fait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select distinct tach_code_gsp from DTM.TACH_DIM_TACHE --5388 lignes pour cette partie
    where TACH_CODE_GSP  not in (
    								select distinct  tach_code_gsp			 -- 5385 lignes pour cette partie
    								from			 DTM.TACH_DIM_TACHE t 
    								WHERE			 t.TACH_WBS_TACHE = '0'
    							)
    comme je l'ai mis dans les commentaires, je m'attends a voir 3 lignes
    et non, j'ai 0 ligne !

    je me dis que c'est parce que toutes mes projets ont peut etre une tache avec un code a 0

    mais si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select distinct tach_code_gsp from DTM.TACH_DIM_TACHE
    except
    select  distinct tach_code_gsp from 
    DTM.TACH_DIM_TACHE t 
    WHERE TACH_WBS_TACHE = '0'
    il me retourne bien les 3 lignes !

    et si je verifie avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select *  from DTM.TACH_DIM_TACHE where tach_code_gsp = 'GSP10451'
    par exemple
    il n'y a bien aucune tache avec un code à 0

    PIRE :
    si je reprends ma premiere requete, mais que dans le not in, j'ecris en dur le resultat de la sous requete, ca marche !

    avez vous une idée ? !! ca me rend dingue

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 758
    Points : 52 535
    Points
    52 535
    Billets dans le blog
    5
    Par défaut
    C'est parfaitement normal. NOT IN combiné à une sous-requête qui peut renvoyer du NULL, de donnera jamais rien.
    Supprimez les absences de valeur et vous trouverez les bonnes données...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select distinct tach_code_gsp 
    from DTM.TACH_DIM_TACHE --5388 lignes pour cette partie
    where TACH_CODE_GSP  not in (select tach_code_gsp	 -- 5385 lignes pour cette partie
                                 from    DTM.TACH_DIM_TACHE t 
                                 WHERE   t.TACH_WBS_TACHE = '0' AND tach_code_gsp IS NOT NULL)
    Au passage débarrassez vous du DISTINCT dans la sous requête qui ne sert à rien !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 788
    Points
    30 788
    Par défaut
    Essaye aussi avec EXISTS et compare les plans d'exécution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select  distinct 
            tach_code_gsp 
    from    dtm.tach_dim_tache  res
    where   not exists
            (   select  null
                from    dtm.tach_dim_tache  det 
                where   det.tach_code_gsp   = res.tach_code_gsp
                    and det.tach_wbs_tache  = '0'
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Alors, déjà, MERCI !
    ok pour le distinct, mais c'était lorsque j'ai voulu afficher le nombre de lignes de la sous requete

    je commençais a devenir fou !

    MERCI MERCI et MERCI

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Essaye aussi avec EXISTS et compare les plans d'exécution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select  distinct 
            tach_code_gsp 
    from    dtm.tach_dim_tache  res
    where   not exists
            (   select  null
                from    dtm.tach_dim_tache  det 
                where   det.tach_code_gsp   = res.tach_code_gsp
                    and det.tach_wbs_tache  = '0'
            )
    ;
    j'ai testé et j'avais le même comportement qu'avec le not in

    Merci pour l'aide !!


    ERATUM :
    j'ai repris TA requete avec le exists,et ca marche impec !!

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Essaye aussi avec EXISTS et compare les plans d'exécution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select  distinct 
            tach_code_gsp 
    from    dtm.tach_dim_tache  res
    where   not exists
            (   select  null
                from    dtm.tach_dim_tache  det 
                where   det.tach_code_gsp   = res.tach_code_gsp
                    and det.tach_wbs_tache  = '0'
            )
    ;
    tu pourrais me détailler ta requete, j'ai du mal à comprendre la logique avec le null dans le select ?
    car moi j'avais ecrit pour que ca marche, et effectivement en enlevant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and  dtm.tach_dim_tache  is not null
    j'avais le comportement premier ( à cause du null)


    Citation Envoyé par al1_24 Voir le message
    Essaye aussi avec EXISTS et compare les plans d'exécution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select  distinct 
            tach_code_gsp 
    from    dtm.tach_dim_tache  res
    where   not exists
            (   select   dtm.tach_dim_tache  
                from    dtm.tach_dim_tache  det 
                where   det.tach_code_gsp   = res.tach_code_gsp
                    and det.tach_wbs_tache  = '0' and  dtm.tach_dim_tache  is not null
            )
    ;
    Merci

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 788
    Points
    30 788
    Par défaut
    Citation Envoyé par FraocH Voir le message
    j'ai du mal à comprendre la logique avec le null dans le select
    Avec l'opérateur EXISTS, ce qui se trouve à l'intérieur de la clause SELECT n'a avoir aucune importance. On peut aussi bien y mettre une constante qu'une expression, cela ne devrait avoir aucune incidence sur le résultat de la requête.
    J'ai l'habitude d'utiliser NULL pour bien marquer que cela ne sert à rien, d'autres utilisent 0 ou 1. Cella n'a aucune importance.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 758
    Points : 52 535
    Points
    52 535
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Avec l'opérateur EXISTS, ce qui se trouve à l'intérieur de la clause SELECT n'a avoir aucune importance. On peut aussi bien y mettre une constante qu'une expression, cela ne devrait avoir aucune incidence sur le résultat de la requête.
    J'ai l'habitude d'utiliser NULL pour bien marquer que cela ne sert à rien, d'autres utilisent 0 ou 1. Cella n'a aucune importance.
    Je suis encore plus pervers, car je met :
    Ce qui planterait systématiquement s'il exécutait la clause SELECT !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Avec l'opérateur EXISTS, ce qui se trouve à l'intérieur de la clause SELECT n'a avoir aucune importance. On peut aussi bien y mettre une constante qu'une expression, cela ne devrait avoir aucune incidence sur le résultat de la requête.
    J'ai l'habitude d'utiliser NULL pour bien marquer que cela ne sert à rien, d'autres utilisent 0 ou 1. Cella n'a aucune importance.
    OK
    Merci !!

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Je suis encore plus pervers, car je met :
    Ce qui planterait systématiquement s'il exécutait la clause SELECT !

    A +
    je trouve ça drole aussi , mais pas sur que les users soient contents si leurs applis plantent

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 521
    Points
    38 521
    Billets dans le blog
    9
    Par défaut
    L'explication est que la requête (not) exists ne transporte aucune donnée de la table ni donnée calculée, mais seulement un booléen

    A noter : select null n'est pas utilisable sur tous les SGBD

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Alors, dans le cas d'une création de liste par exemple, il vaut mieux utiliser un (not) exists qu'un (not) in, pour alléger les calculs ?

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 758
    Points : 52 535
    Points
    52 535
    Billets dans le blog
    5
    Par défaut
    Cela dépend de la qualité de l'optimseur....

    Sur un bon SGBDR, le plan de requête final ne devrait pas être différent.

    Sur un mauvais, genre MySQL, cela peut être très important !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  14. #14
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    ok merci

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

Discussions similaires

  1. [Oracle] Problème d'affichage d'un résultat de requête simple
    Par Mikl-Dba dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/09/2011, 09h34
  2. Réponses: 2
    Dernier message: 19/08/2011, 10h02
  3. Réponses: 3
    Dernier message: 11/01/2006, 18h35
  4. Application simple qui pourtant ne marche pas
    Par ThanosT dans le forum C
    Réponses: 8
    Dernier message: 30/09/2005, 21h02
  5. [DEBUTANT] TSqlQuery & requête simple
    Par fred64 dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/04/2004, 11h35

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