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 :

Problème très bizarre avec COUNT


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Problème très bizarre avec COUNT
    Bonjour,

    La table ARTICLESPOSSEDES décrit la liste des articles que possède chaque personne. Une ligne correspond à un
    article (représenté par un numéro pour simplifier) possédé par une personne. Pour connaître tous les articles
    que possède une personne donnée, il faut exécuter la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ARTICLE FROM ARTICLESPOSSEDES WHERE NOM = <Nom personne>;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> DESC ARTICLESPOSSEDES
    Name      Type         Nullable Default Comments                             
    --------- ------------ -------- ------- ------------------------------------ 
    NOM       VARCHAR2(10)                  Nom               
    ARTICLE   NUMBER(3)                     Article possédé
    La table PERSONNE stocke une liste de personnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SQL> DESC PERSONNE
    Name    Type         Nullable Default Comments                       
    ------- ------------ -------- ------- ------------------------------ 
    ID       NUMBER(4)                     Identifiant  
    TYPE     NUMBER(3)                     Type d'emploi occupé
    NOM      VARCHAR2(10)                  Nom 
    PRENOM   VARCHAR2(10)                  Prénom 
    Tel      NUMBER(4)                     Numéro de téléphone 
    Age      NUMBER(3)                     Age
    Je veux exécuter une requête qui indique si une personne de type 100 et d'âge 20 ans possède ou non, comme TOTO, l'article 200.
    Le cas échéant, la requête doit me renvoyer la ligne concernée, sinon, elle ne doit rien me renvoyer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT *  
    FROM Personne P  
    WHERE P.ID = 100  
    AND P.AGE = 20
    AND  (SELECT COUNT(1) 
          FROM ARTICLESPOSSEDES A     
          WHERE A.NOM='TOTO' 
          AND A.ARTICLE=200) 
                 =  	
          (SELECT COUNT(1) 
          FROM ARTICLESPOSSEDES A 
          WHERE A.ARTICLE=F.FWEPROF 
          AND A.ARTICLE=200)
    1er cas
    TOTO possède l'article 200 et il existe des personnes de type 100 et d'âge 20 ans qui possèdent le susdit article, alors
    ma requête doit me renvoyer la liste de ces personnes.

    2nd cas
    TOTO possède l'article 200 et personne de type 100 et d'âge 20 ans ne possède le susdit article, alors, ma requête
    ne doit rien me renvoyer.

    3ième cas
    TOTO ne possède pas l'article 200 et il existe des personnes de type 100 et d'âge 20 ans qui possèdent le susdit article, alors, ma requête
    ne doit rien me renvoyer du tout non plus.

    Ces trois cas-là fonctionne très bien, j'obtiens les réponses appropriées.

    En revanche, il en est autrement avec le 4ième cas :
    TOTO ne possède pas l'article 200 et personne non plus de type 100 et d'âge 20 ans ne possèdent cet article. Le requête
    me renvoie une liste vide, alors qu'elle devrait me renvoyer au moins une ligne.

    Je précise quand même qu'il existe évidemment des personnes de type 100 et d'âge 20 ans dans la table PERSONNE.

    La requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT(1) 
          FROM ARTICLESPOSSEDES A     
          WHERE A.NOM='TOTO' 
          AND A.ARTICLE=200
    me renvoie 1, si TOTO possède l'article, 0 sinon. :

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    La réponse donnée dans le post ci-dessous répond-elle à ton interrogation ?
    http://www.developpez.net/forums/vie....php?p=2115805
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Membre régulier Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Points : 95
    Points
    95
    Par défaut
    Salut

    et comme ça... est ce que ça répond à ta question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT * 
      FROM Personne P1
          ,ARTICLESPOSSEDES A1 
     WHERE P1.NOM = A1.NOM
       AND A1.NOM = 'TOTO'
       AND A1.ARTICLE = 200
       AND EXISTS (SELECT 1
                     FROM ARTICLESPOSSEDES A2
    		     ,PERSONNE P2
                    WHERE P2.NOM = A2.NOM
    		  AND P2.ID = 100 
                      AND P2.AGE = 20
                      AND A2.ARTICLE = 200)
    Bon courage, @+

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Xo
    Salut,

    La réponse donnée dans le post ci-dessous répond-elle à ton interrogation ?
    http://www.developpez.net/forums/vie....php?p=2115805
    Elle me donne des indications. Visiblement, le gars a le même problème avec le COUNT qui ne renvoie pas 0 s'il n'y a aucun enregistrement trouvé.

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Titouf
    Salut

    et comme ça... est ce que ça répond à ta question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT * 
      FROM Personne P1
          ,ARTICLESPOSSEDES A1 
     WHERE P1.NOM = A1.NOM
       AND A1.NOM = 'TOTO'
       AND A1.ARTICLE = 200
       AND EXISTS (SELECT 1
                     FROM ARTICLESPOSSEDES A2
    		     ,PERSONNE P2
                    WHERE P2.NOM = A2.NOM
    		  AND P2.ID = 100 
                      AND P2.AGE = 20
                      AND A2.ARTICLE = 200)
    Ta requête te donne la liste des personnes de 20 ans de type 100 et qui, tout comme TOTO, possède l'article 200. Par contre, elle ne prend pas
    en compte la possibilité que TOTO ne possède pas l'article 200. Le cas échéant, elle doit me renvoyer la liste des personnes de 20 ans, de type 100
    et qui, tout comme TOTO, ne possède pas l'article 200. Je sais, cela a l'air un peu tordu, mais il faut connaître le contexte.

    Ceci dit, j'ai formulé différemment ma requête. C'est un peu plus lourd, mais bon ça marche...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 1 
    FROM Personne P  
    WHERE P.ID = 100  
    AND P.AGE = 20
    AND (
    	 (SELECT COUNT(1) FROM ARTICLESPOSSEDES A WHERE A.NOM='TOTO' AND A.ARTICLE=200) =  	
         (SELECT COUNT(1) FROM ARTICLESPOSSEDES A WHERE A.ARTICLE=F.FWEPROF AND A.ARTICLE=200) 
    	                          OR
    	 (P.NOM NOT IN (SELECT A.NOM FROM ARTICLESPOSSEDES A WHERE A.ARTICLE=200) AND 
    	  'TOTO' NOT IN (SELECT A.NOM FROM ARTICLESPOSSEDES A WHERE A.ARTICLE=200))
    	);
    En fait, ce qui me turlupine, c'est pourquoi la clause

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (SELECT COUNT(1) FROM ARTICLESPOSSEDES A WHERE A.NOM='TOTO' AND A.ARTICLE=200) =  	
         (SELECT COUNT(1) FROM ARTICLESPOSSEDES A WHERE A.ARTICLE=F.FWEPROF AND A.ARTICLE=200)
    n'est pas vérifiée lorsque COUNT me renvoie 0. Pourtant 0=0 est bien vrai...

    Mais bon, j'ai une requête qui marche, même si elle est moins performante que celle initiale.


    Citation Envoyé par Titouf
    Bon courage, @+
    Merci, à toi aussi.

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/05/2012, 07h19
  2. Problème très bizarre
    Par Gaetch dans le forum WinDev
    Réponses: 2
    Dernier message: 28/10/2008, 12h55
  3. problème très étrange avec mes tableaux
    Par lelutin dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/09/2006, 14h47
  4. Réponses: 1
    Dernier message: 03/11/2005, 18h44
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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