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

SQL Oracle Discussion :

requete sql avancée


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut requete sql avancée
    svp j'ai le schéma relationnel suivant:
    CLIENT(code,nom,prenom,localite,num_tel,categorie)
    COMMANDE(num_cmd,#code,date_cmd)
    ARTICLE(ref _article,designation,prix_HT, TVA)
    LIGNE_CMD(#num_cmd,#ref_article,quantite,remise)
    CHIFFRE_AFFAIRE(journee,montant)
    Afficher les produits qui sont commandés dans toutes les localités?
    je n'arrive pas à trouver une réponse

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 385
    Par défaut
    Bonjour,
    Avant de chercher à écrire une requête, il faut extraire la logique de la demande.
    Ici: qu'est-ce qu'on peut dire d'un produit commandé dans toutes les localités ? C'est un produit pour lequel on (peut dire ceci)/(on ne peut pas dire cela, dans le sens "on ne peut pas trouver cela")… à toi de compléter.
    Une fois cette phase passée, on peut chercher comment traduire ceci en SQL.

    Tatayo.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Il manque une table localité dans ton schéma relationnel, ou alors il faudrait préciser à quoi correspond "dans toutes les localités".
    Je suis d'accord avec tatayo, sur la méthodologie à appliquer.
    Comme ta demande ressemble à un exercice, on ne va pas te donner la réponse, on va essayer de te la faire trouver, cela sera plus formateur.
    PS : ce n'est pas de la flemme, il est beaucoup plus compliquer d'expliquer comment trouver la réponse que de donner la réponse sans commentaire.
    Cordialement
    Soazig

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    j'ai essayé normallement ça ve être une requete imbriquée ,la sous requete d'après mon raisonnement est "select distinct localite from client " et comme ça on va récupérer toutes les localité existante à partir de la table client mais comment au niveau de requete principal je veux comparer les produit peut etre regroupé par réference produit et de verifier que les localités existe dans la sous requete?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    rebonjour,
    Tatayo, t'as proposé de réexpliquer en français ce que tu souhaites obtenir et toi tu nous parles sql.
    Afficher les produits qui sont commandés dans toutes les localités?
    On cherche donc la liste des produits qui ont des commandes passés par des clients présents dans toutes les localités.
    Ce qui peut se paraphraser d'autres façon je te laisse l'exprimer.
    Cordialement
    Soazig

  6. #6
    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
    Par défaut
    Bonjour,

    Il s'agit d'une division relationnelle. cet article pourra vous aider.

  7. #7
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    Merci beaucoup c'est ça ce que je cherche

  8. #8
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    mais est ce que le shéma donné est suffisant pour écrire la requete est ce qu'il ne manque pas une table localité car si un sujet d'examen et c'est le shéma donné

  9. #9
    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
    Par défaut
    Sur le principe, si !
    Il manque la tables de localité pour répondre correctement à la demande.
    De la même manière, le schéma est également mauvais à cause de la table CHIFFRE_AFFAIRE qui n'y a pas sa place : elle contient le résultat de calcul découlant des autres tables, et induit donc de la redondance.

    Pour ce qui est des localités, vous pouvez toutefois en obtenir la liste en faisant un DISTINCT des localités sur la table client...

  10. #10
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    Pour ce qui est des localités, vous pouvez toutefois en obtenir la liste en faisant un DISTINCT des localités sur la table client...[/QUOTE]
    oui j'ai essayé d'écrire cette requete mais je ne suis pas sure si elle est juste ou non:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL>select designation,ref_article
    from ligne_cmd,article,commande,client
    where ligne_cmd.ref_article=article.ref_article and linge_cmd.num_cmd=commande.num_cmd and commande.code=client.code
    group by ref_article
    having count(distinct localite)=(select count(distinvt localite) from client);
    j'ai cette erreur:
    group by ref_article
    *
    ERROR at line 4:
    error:ORA-00918 :column ambiguously defined

  11. #11
    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
    Par défaut
    cette erreur est due au fait que la colonne ref_article est présente dans plusieurs table.
    Il faut donc spécifier de quelle table il s'agit, en le spécifiant sous la forme table.colonne

  12. #12
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 385
    Par défaut
    Je dirai qu'elle est fausse, car tu as une colonne dans la clause SELECT qui ne fait pas l'objet d'une agrégation, et qui n'est pas dans la clause GROUP BY.

    Tatayo.

  13. #13
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 201
    Par défaut
    j'ai cette erreur:
    group by ref_article
    *
    ERROR at line 4:
    error:ORA-00918 :column ambiguously defined
    Les messages ORA-00xxxx sont pratiques.
    Tu tapes ORA-00918 sur ton moteur de recherche et tu as une page qui va te dire clairement quelle est ton erreur.

    Mais attention, quand tu auras corrigé cette erreur (column ambiguously defined), Oracle te signalera une autre erreur, puis une autre, puis une autre. Et quand Oracle ne te signalera plus d'erreur, il acceptera d'exécuter ta requête, mais rien ne dit qu'elle donnera le bon résultat.

    Tu essaies d'aller trop vite.

    Quand un designer fait un dessin pour une nouvelle voiture, il fait un vague croquis, il teste, il valide , ok c'est une bonne piste. Puis il ajoute des phares, puis il ajoute quelques finitions... Mais étape par étape il valide ce qu'il fait.

    Une requête SQL, c'est pareil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select designation,ref_article
    from ligne_cmd,article,commande,client
    where ligne_cmd.ref_article=article.ref_article and linge_cmd.num_cmd=commande.num_cmd and commande.code=client.code
    Cette requête est elle valide ? Si elle n'est pas valide, il faut la corriger.
    Ensuite , tu peux ajouter la clause Group by
    Ensuite, tu peux ajouter une condition ( having ...)

    Mais si tu essaies de faire ta requête d'un seul jet, tu n'y arriveras pas. En tout cas, moi, je ne suis pas capable, et pourtant, tous mes collègues trouvent que je suis vraiment très fort avec Oracle.

  14. #14
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    j'ai enfin arrivé a ce que je veux et j'écris une requete imbriquée chacune des deux requete fonctioone correctement si je l'écris a part seule
    mais la requete toute entière elle m'affiche cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL>select ref_article,count(ref_article) as total
    from(select localite,ref_article
                from ligne_cmd,article,commande,client
                where code=cod and num_cmd=num_cm and ref_article=ref_articel
                group by localite,ref_article)
    group by ref_article
    having total=select count(distinct localite) from client;
    j'ai testé les deux requetes chacune seul elle fonctionne parfaitement et retourne ce que je vex maid en regroupant les deux sous forme de requete imbriqué elle affiche ce message:
    ERROR at line 7:
    ORA-00936: missing expression

  15. #15
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 133
    Par défaut
    2 erreurs au moins :
    Ligne 5 : une table dérivée doit avoir un nom d'alias
    Ligne 7 : La sous-requête scalaire doit être encadrée de parenthèses
    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.

  16. #16
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Ligne 5 : une table dérivée doit avoir un nom d'alias
    Non pas forcément. C'est comme une vue, tant que tu n'as pas d'ambiguous column, ça fonctionne bien.
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT owner, COUNT(*)
    FROM (SELECT * FROM all_tables)
    group by owner

  17. #17
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 385
    Par défaut
    J'ajouterai à la réponse d'al1_24 une autre "erreur": le GROUP BY dans la sous-requête ne sert à rien, il n'y a aucune fonction d'agrégation. Un DISTINCT suffira ici.
    Ensuite il faudrait revoir la sous-requête, elle gagnerait en lisibilité si les jointures étaient écrites avec un INNER JOIN, et si les colonnes étaient préfixées.

    Pour finir, je pense que la sous-requête est inutile. Tu peux parfaitement faire un:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
     select a.ref_article,count(distinct c.localite) fromgroup by a.ref_article
    .

    Tatayo.

  18. #18
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    j'écris cette requete,normallement elle m'a affiché la réponse de ce que je veux mais je sais pas si elle juste a 100%
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL>select ref_article,count(ref_article)
    from(select localite,ref_article
    from ligne_cmd,article,commande,client
    where code=cod and num_cmd=num_cm and ref_article=ref_articel
    group by localite,ref_artcile)
    group by ref_article
    having count(ref_article)=(select count(distinct localite) from client);
    je l'ai testé elle m'a retourné le résultat que je veux elle est fonctionelle mais je cherche a le travailler evec exists car ils ont beaucoup parler de la division relationnel avec l'opérateur exists et not exists

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