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 :

Bloqué sur deux requêtes SQL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 29
    Points : 24
    Points
    24
    Par défaut Bloqué sur deux requêtes SQL
    * Bonjour, *

    voila j'ai un petit souci dans cet exercice :
    soit la bd suivante :
    Chanteur (ChanteuriD,Nom, Prénom, Sexe, Tel)
    Concert (ConcertID, Date, Heure, Espaceid#, ChanteurID#)
    Espace (EspaceiD, Nom, Adresse, Capacité)
    Billet (BilletId,ConcertID#, NumPlace, Catégorie, Prix)
    Vente (Venteid, DateVente, Billetid#, MoyenPaiement)
    1. Quelles sont les dates du concert de Fairouz à Bougamine ?
    2. Quels sont les noms des espaces ayant la plus grande capacité ?
    3. Quels sont les chanteurs n'ayant jamais réalisé de concert au théâtre de Carthage ?
    4. Quels sont les chanteurs ayant réalisé au moins un concert dans tous les espaces ?
    5. Quels sont les dates et les identificateurs des concerts pour lesquels tous les billets sont vendus ?
    je reussi à resoudre les 3 premiers mais je suis bloqué dans 4 et 5

    je poste ma solution pour 1 2 3 et merci de m'aider pour les autres et silya des remarques pour les 3 premiers seront le bienvenue aussi

    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT concert.date
    FROM espace, chanteur, concert
    WHERE (((chanteur.chanteurID)=[concert].[chanteurid]) AND ((espace.espaceid)=[concert].[espaceid]) AND
     ((chanteur.nom)="Fairouz") AND 
    ((espace.nom)="Bougarnine"));
    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT espace.nom
    FROM espace
    WHERE (((espace.capacite)=(SELECT Max(capacite)
    FROM espace)));
    3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select chanteurid from chanteur where chanteurid not  in ( 
    SELECT DISTINCT (chanteur.chanteurID) 
    FROM espace,chanteur , concert  
    WHERE 
    chanteur.chanteurID = concert.chanteurid AND
     espace.espaceid = concert.espaceid AND
    espace.nom="Carthage");
    * Merci *

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    En quelques mots :
    • Beaucoup de parenthèses inutiles.
    • Les jointures s'expriment avec INNER JOIN
    • Questions 2 et 3 : La condition peut aussi s'exprimer avec EXISTS
    • Question 3 : Inutile d'utiliser la table Chanteur dans la sous-requête

    Montre nous tes tentatives de réponses aux questions suivantes...

    Quelques pistes :
    Question 4 : Il n'y a pas espace où le chanteur n'a pas fait de concert
    Question 5 : Nombre de place vendues pour le concert = capacité de l'espace

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    1- pour les parenthèses c'est du à mon éditeur de requête (access).
    2-la solution pour exercice 2 avec exists
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select nom from espace e
    Where not exists (select  * from espace where e.capacite<capacite)
    3- pour la question 3 aussi voila ma proposition avec exists
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT chanteurid from  chanteur ch 
    WHERE  not exists(select  * from  espace, concert where espace.espaceid=concert.espaceid and ch.chanteurid=concert.chanteurid and espace.nom="aaaa");
    4- question 4 aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT chanteurid
    FROM chanteur AS ch
    WHERE not exists(select  * from  espace e where espaceid not in (select distinct espaceid from concert  where ch.chanteurid=chanteurid));
    pour le question 5 je pas trouver qq chose qui mérite d'etre poster ici
    merci de me donner la solution je suis bloqué .

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    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 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    A propos de votre solution à la question 4 :
    - il est inutile, pour un test d'existence, de faire un distinct, order by, group by etc...
    - vous faites 2 sous requetes imbriquées avec une double négation, ce qui peut fonctionner mais n'est pas utile et ne facilite pas la compréhension
    - votre 2ème requête imbriquée utilise un not in, ce qui n'est pas le mieux pour un test d'existence

    Revenez au libellé de la question 4 : "Quels sont les chanteurs ayant réalisé au moins un concert dans tous les espaces"
    et vous verrez qu'il y a beaucoup plus simple !

    encore un peu de persévérance

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    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 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Pour la question 5, voici une solution, applicable s'il y a bien autant de billets émis pour un concert qu'il y a de places (pas de "surbooking")
    et sous réserve que vous n'utilisiez pas MySQL qui ne connait pas les CTE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -- création d'une table des concerts avec billets invendus 
       With TMP as
           (select distinct ConcertID from Billet as B
            where not exists
                 (select 1 from Vente as V
                  where V.BilletID = B.BilletID)
    -- recherche des concerts pour lesquels il n'y a pas d'invendu
       select C.Concertid
             ,C.Date
       from Concert as C
       where not exists
            (select 1 from TMP as T
             where T.ConcertID = C.ConcertID)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    merci pour votre aide yatil une solution plus simple parce que je suis un enseignent il faut que je trouve une solution adapté au niveau des eleves
    (requete imbrique exists qq chose comme ca ) je suis entrain de préparer pour un coucours d'inspection .

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    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 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Vous pouvez faire aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       select C.Concertid
             ,C.Date
       from Concert as C
       where not exists
            (select 1 from billet as B
             where B.ConcertID = C.ConcertID
               and not exists
                  (select 1 from ventes as V
                   where V.billetID = B.billetID))
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       select C.Concertid
             ,C.Date
       from Concert as C
       where not exists
            (select 1 
             from billet as B
             left outer join ventes as V
               on V.billetID = B.billetID
             where B.ConcertID = C.ConcertID
               and V.billetID is null)
    Personnellement, je trouve la solution via une CTE plus facile à lire, et ça permet à vos étudiants de découvrir le concept très utile de CTE (et incontournable dans certains cas, comme les requêtes récursives)

  8. #8
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    merci c'est gentille mais lorsque je tester les deux requêtes il m'affiche tou la table concert
    es que je mal rempli ma base ou quoi ?

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    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 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Oui ou une erreur lors de la recopie de la requête

    Communiquez le contenu de vos tables s'il n'est pas trop important

  10. #10
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    voile le contenu de 3 tables concerné par la requête
    Nom : Sans titre.png
Affichages : 182
Taille : 26,6 Ko

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    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 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Vous ne devriez donc n'extraire que les concerts 1 et 2 pour lesquels tous les billets ont été vendus

    il y a probablement un morceau de la requête que vous n'avez pas repris , ou alors c'est un bug d'access (je ne peux pas tester sous access, je n'en ai pas sous la main)

  12. #12
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    merci c'est résolu grâce à escartefigue

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

Discussions similaires

  1. Votre avis sur deux requètes SQL
    Par americ dans le forum Développement
    Réponses: 6
    Dernier message: 05/11/2014, 16h25
  2. Sql perte de données sur deux requêtes
    Par parasol007 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/06/2008, 17h37
  3. [SQL] Deux requêtes SQL sur le même formulaire
    Par amazircool dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 18/02/2007, 02h23
  4. Barre de progression sur une requète SQL
    Par Wilco dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/04/2005, 14h20
  5. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 11h12

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