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 :

aide sur une requete


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut aide sur une requete
    Bonjour,

    J'ai un souci sur une requete;
    J'ai deux tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> desc DESSIN
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     DESSIN_ID                                 NOT NULL VARCHAR2(20)
     OBJECT_NAME                               NOT NULL VARCHAR2(8)
     FORMAT_NAME                               NOT NULL VARCHAR2(5)
     
    SQL> desc FORMAT
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     FORMAT_NAME                               NOT NULL VARCHAR2(20)
     COLOR                                              VARCHAR2(5)
     FONT                                               VARCHAR2(5)
     PATTERN                                            VARCHAR2(5)
    Les champs COLOR,FONT,PATTERN sont exclusifs mais un champ parmi les 3 est obligatoire par record.
    je dois vérifier que chaque objet n'utilise qu'un seul type de format (soit COLOR, FONT ou PATTERN)
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select * from DESSIN;
    1	CRAYON		F1
    2	CRAYON		F3
    2	BOITE		F1
    2	BOITE		F2
     
    select * from FORMAT;
    F1	RED
    F2	BLUE
    F3		16xbold
    CRAYON utilise deux types de formats différents (COLOR et FONT) ce qui est interdit, la requete doit ramener l'info CRAYON.
    Si quelqu'un a une idée ?
    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Quelle est la valeur par défaut des colonnes COLOR, FONT et PATTERN ? NULL ou une chaîne vide ?
    Si c'est NULL, tu peux essayer la requête suivante qui devrait te donner seulement les objets qui utilisent à la fois au moins deux colonnes sur les trois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT d.OBJECT_NAME, COUNT(f.COLOR) AS NbColor, COUNT(f.FONT) AS NbFont, COUNT(f.PATTERN) AS NbPattern
    FROM DESSIN AS d
    INNER JOIN FORMAT AS f ON d.FORMAT_NAME = f.FORMAT_NAME
    GROUP BY d.OBJECT_NAME
    HAVING (NbColor > 0 AND NbFont > 0)
        OR (NBColor > 0 AND NbPattern > 0)
        OR (NbFont > 0 AND NbPattern > 0)

  3. #3
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci de votre aide, mais je ne comprends pas ou est l'erreur de syntaxe. Je suis sous oracle 10i qui accepte donc le inner join.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> select d.object_name,count(f.color) as nbcolor,count(f.font) as nbfont,count(f.pattern) as nbpattern
      2  from dessin as d
      3  inner join format as f on d.format_name=f.format_name
      4  group by d.object_name
      5  having (nbcolor > 0 and nbfont > 0)
      6      or (nbcolor > 0 and nbpattern > 0)
      7      or (nbfont > 0 and nbpattern > 0);
    from dessin as d
                *
    ERROR at line 2:
    ORA-00933: SQL command not properly ended
    SQL>
    D'ailleurs, je n'ai pas l'habitude de l'utiliser, j'aurais plutot fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select d.object_name
    from dessin d,format f
    where d.format_name=f.format_name
    Est ce équivalent ?
    merci

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Je crois que sous Oracle tu ne peux pas utiliser AS pour aliaser les tables
    (par contre pour les colonnes, c'est bon).

    Pour les jointures, les écritures sont à priori équivalentes, mais la jointure normalisée (JOIN) est plus lisible et structurante pour tes requêtes.

    (Par contre, perso, j'aime pas écrire INNER JOIN)

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Je crois que sous Oracle tu ne peux pas utiliser AS pour aliaser les tables
    (par contre pour les colonnes, c'est bon).
    Et on les 'aliase' comment ?
    'FROM latable t' sans le AS ?

    Pour les jointures, les écritures sont à priori équivalentes, mais la jointure normalisée (JOIN) est plus lisible et structurante pour tes requêtes.
    Tout à fait ! Débat déjà fait dans les forums de multiples fois !

    (Par contre, perso, j'aime pas écrire INNER JOIN)
    SQLPro dirait qu'en écrivant la syntaxe complète INNER ou OUTER JOIN on se rend mieux compte de la nature de la jointure interne ou externe.

    Moi perso c'est OUTER que je n'écrivais pas, considérant que RIGHT ou LEFT était suffisant. Mais bon, y a pas de quoi fouetter un chat non plus !

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Tout à fait CinePhil : tu aliases directement sans AS.

    INNER ou OUTER par défaut, c'est clairment une histoire de goût

    Perso, je considère que par nature (et donc par défaut) la jointure est interne, et que c'est la jointure externe qui est un opérateur spécial...

  7. #7
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Oui sans le AS, cela est mieux mais les alias sur les count ne semblent pas être pris en compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    SQL> select d.object_name,count(f.color) nbcolor,count(f.font) nbfont,count(f.pattern) nbpattern
      2  from dessin d,format f
      3  where d.format_name=f.format_name
      4  group by d.object_name;
     
    OBJECT_NAM    NBCOLOR     NBFONT  NBPATTERN
    ---------- ---------- ---------- ----------
    BOITE               2          0          0
    CRAYON              1          1          0
     
    SQL> select d.object_name,count(f.color) nbcolor,count(f.font) nbfont,count(f.pattern) nbpattern
      2  from dessin d,format f
      3  where d.format_name=f.format_name
      4  group by d.object_name
      5  having (nbcolor > 0);
    having (nbcolor > 0)
            *
    ERROR at line 5:
    ORA-00904: "NBCOLOR": invalid identifier
    SQL>
    Avec le inner join, c'est pas mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> select d.object_name,count(f.color) nbcolor,count(f.font) nbfont,count(f.pattern) nbpattern 
      2  inner join format f on d.format_name=f.format_name
      3  group by d.object_name
      4  ;
    inner join format f on d.format_name=f.format_name
    *
    ERROR at line 2:
    ORA-00923: FROM keyword not found where expected
     
     
    SQL>
    Merci

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    L'alias ne passe pas dans le HAVING.

    Remplace par la définition exacte

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Pff ! Pas pratique Oracle !

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    C'est interdit par la norme SQL de passer l'alias dans le GROUP BY.
    1) ce n'est pas logique
    2) cela peut entraîner des erreurs

    Certains SGBDR peu scrupuleux l'on implémenté. Exemple (hélas) MySQL !

    A +

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Bien Maître !
    Tous les jours j'apprends !

  12. #12
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    ok cela marche avec la jointure classique (mais pas avec le inner join !!!)
    Je m'en contenterais.
    Merci à tous

  13. #13
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Relis bien l'erreur, et tu trouveras !

    Petit indice : il se peut que tu aies perdu une ligne

  14. #14
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Oui, je viens de trouver mon erreur ... avec un peu de retard !
    Bye

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

Discussions similaires

  1. [Debutant] Aide sur une requete normée
    Par Wisefool dans le forum Oracle
    Réponses: 2
    Dernier message: 14/04/2006, 18h41
  2. Besoin d'aide sur une requete ds un trigger
    Par ideal dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 15/02/2006, 10h05
  3. [MySQL] aide sur une requete
    Par dj-julio dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/01/2006, 14h25
  4. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 15h17
  5. Aide sur une requete de sélection
    Par stephdiplo150 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/01/2004, 10h40

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