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 :

Requête qui me bloque


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut Requête qui me bloque
    Bonjour,

    J'ai quatre tables:
    CLIENT(NumCli, Adresse, Ville)
    COMMANDE(NumCom, Client, Date)
    Client référence NumCli
    PRODUIT(NumPro, Prix)
    DETAIL_COMMANDE(Commande, Produit, Quantité)
    Commande référence NumCom
    Produit référence NumPro

    Je veux les produits commandés par tous les clients de Londres.
    Je sais qu'il me faut une jointure entre CLIENT, COMMANDE et DETAIL_COMMANDE mais je ne sais pas comment exprimer la requête pour trouver un produit commandé par tous les clients d'une ville.
    Pouvez-vous m'aider s'il vous plaît?

  2. #2
    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 803
    Points
    30 803
    Par défaut
    Montre nous déjà la requête que tu as commencé à écrire.
    Nous pourrons alors t'aider à l'améliorer.
    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.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select Produit 
    from DETAIL_COMMANDE, COMMANDE, CLIENT
    where Commande = NumCom and Client = NumCli 
             and Client in (select NumCli
                               from CLIENT
                               where lower(Ville) in ('london', 'londres'))
    Mais ce code ne retourne que les produits commandés par au moins un client de Londres. Une piste s'il vous plaît?

  4. #4
    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 803
    Points
    30 803
    Par défaut
    Ecrivez vos requêtes avec des jointures normalisées.
    Utilisez des alias sur vos tables et qualifiez vos noms de colonnes.
    La requête sera plus lisible...

    Ensuite, l'autre manière de formuler la question posée :
    Je cherche les produits pour lesquels il n'y a pas un client de londres qui ne l'ait pas commandé
    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.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Une piste de plus?

  6. #6
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    Je cherche les produits pour lesquels il n'existe pas un seul client de londres qui ne l'ait pas commandé
    Pour n'existe pas, voir NOT EXISTS.

    @+

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Bonjour,
    Merci al1_24 et agemis31 pour votre aide. Ce code ne retourne pas le résultat voulu. Est-ce que vous pouvez m'indiquer où l'erreur réside?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select NumPro from PRODUIT 
    where not exists ((select NumCli from CLIENT where Ville='Londres')
    except (select NumCli from DETAIL_COMMANDE natural join 
               COMMANDE natural join CLIENT 
               where Produit=NumPro))
    Je voudrais savoir comment référencer NumPro du premier SELECT pour qu'il soit le même qui est dans le dernier WHERE.

  8. #8
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Une petite lecture pour les jointures...

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  9. #9
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Merci Chtulus!

  10. #10
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour

    WHERE NOT EXISTS ((SELECT NumCli FROM CLIENT WHERE Ville='Londres')
    Ne renvera rien s'il y a au moins un client à londres !

    En reprenant l'énoncé précédent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * from produit WHERE NOT EXISTS (
    SELECT * FROM COMMANDE 
    INNER JOIN DETAIL_COMMANDE 
    ON COMMANDE.NumCom = DETAIL_COMMANDE.Commande 
    INNER JOIN CLIENT 
    ON COMMANDE.Client = CLIENT.NumCli  
    WHERE 
    LOWER(CLIENT.Ville) IN ('london', 'londres')
    AND ...)
    @+

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Je crois que c'est le bon code: ça a retourné le bon résultat!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT NumPro FROM PRODUIT WHERE NOT EXISTS (
    (SELECT NumCli FROM CLIENT 
    WHERE LOWER(CLIENT.Ville) IN ('londres', 'london')) 
    except (SELECT NumCli FROM COMMANDE 
    INNER JOIN DETAIL_COMMANDE 
    ON COMMANDE.NumCom = DETAIL_COMMANDE.Commande 
    INNER JOIN CLIENT 
    ON COMMANDE.Client = CLIENT.NumCli  
    WHERE 
    NumPro = DETAIL_COMMANDE.Produit))
    Merci à tous

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

Discussions similaires

  1. Une requête qui bloque d'autres tables
    Par iubito dans le forum Administration
    Réponses: 0
    Dernier message: 04/01/2012, 08h48
  2. Requête de suppression qui reste bloquée
    Par lidybekham07 dans le forum Oracle
    Réponses: 23
    Dernier message: 07/07/2011, 11h51
  3. Requête qui se bloque
    Par cjacquel dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 09/09/2008, 21h00
  4. requête MySQL de création de table qui me bloque !
    Par kamaldev dans le forum Requêtes
    Réponses: 17
    Dernier message: 19/02/2008, 10h41
  5. Requête SQL qui me bloque
    Par David Guillouet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2004, 14h52

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