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 :

Sous-Sous requête - SQL et Access


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 108
    Points : 52
    Points
    52
    Par défaut Sous-Sous requête - SQL et Access
    Bonjour à tous, j'espère que je suis dans le bon topic (il s'agit de SQL en général, même si je suis dans Access

    Je dois faire une série de travaux (requêtes) de plus en plus difficiles, et je cale sur une requête. La bonne nouvelle c'est que je n'ai pas d'erreur de syntaxe. La mauvaise nouvelle c'est que je n'obtiens pas le résultat escompté (vide)

    La requête 13 est la même que la requête 12, sauf que la 12 se fait avec jointure et la 13 doit se faire sans jointure.
    Consigne: r12 Qt disp par produit commandés à Poitiers Jointure Inner Join
    r13 Qt disp par produit commandés à Poitiers ! sans jointure, avec sous-requete in(Select(..in(Select(..))


    Pour la 12, je l'ai réussie et le code est celui-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT Produit.NProd, Produit.Qt_Inv AS Qt_Disp
    FROM Produit INNER JOIN ((Client INNER JOIN Commande ON Client.NCli = Commande.NCli) INNER JOIN Detail ON Commande.NCmd = Detail.NCmd) ON Produit.NProd = Detail.NProd
    WHERE (((Client.Localite)="Poitiers"));
    Le résultat est donc celui qui est attendu et que j'obtiens:
    NProd Qt_Disp
    CS262 10
    CS464 20
    PA45 30
    PA60 12


    Pour la requête 13, je ne sais pas comment je dois m'y prendre mais j'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Produit.NProd, Produit.Qt_Inv AS Qt_Disp
    FROM Produit
    WHERE Produit.NProd IN (
            SELECT Detail.NCmd FROM Detail WHERE Detail.NCmd IN (
                    SELECT Commande.NCmd FROM Commande WHERE Commande.NCli IN (
                            SELECT Client.NCli FROM Client WHERE (Client.Localite = "Poitiers")
                    )
            )
    );
    J'ai du foirer quelque part mais je ne sais pas vraiment où.
    Voici ma BD pour exemple en pièce jointe
    J'aimerais qu'on m'explique où se trouve mon erreur. Si j'ai bien compris, le In Select doit se référer au champ commun qui est lié d'une table à une autre

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Produit.NProd, Produit.Qt_Inv AS Qt_Disp
    FROM Produit
    WHERE Produit.NProd IN (
            SELECT Detail.NProd FROM Detail WHERE Detail.NCmd IN (
                    SELECT Commande.NCmd FROM Commande WHERE Commande.NCli IN (
                            SELECT Client.NCli FROM Client WHERE (Client.Localite = "Poitiers")
                    )
            )
    );

    Ton problème vient du fait que tu fait ta jointure entre Produit et Détail sur Produit.NProd = Detail.NCmd
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  3. #3
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Dans votre première sous requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE Produit.NProd IN (
            SELECT Detail.NCmd
    Vous cherchez les numéros de produit correspondant à des numéros de commandes...
    Forcément, ça doit marcher beaucoup moins bien

    edit : mokona18 a été plus rapide...

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Juste un truc...

    Plutôt que de faire des sous-requêtes, pourquoi ne pas faire des jointures ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Produit.NProd, Produit.Qt_Inv AS Qt_Disp
    FROM Produit
    inner join detail on detail.nprod = produit.nprod
    inner join commande on commande.ncmd = detail.ncmd
    inner join client on client.ncli = commande.ncli
    WHERE Client.Localite = 'Poitiers';

    Non seulement le moteur du SBGD va moins galérer à faire des jeux de résultats intermédiaires inutiles, mais aussi et surtout les jointures sont bien plus lisibles à lires, et on repère plus rapidement l'erreur relevée par mokona (que j'ai corrigé dans mon exemple)
    On ne jouit bien que de ce qu’on partage.

  5. #5
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Juste un truc...

    Plutôt que de faire des sous-requêtes, pourquoi ne pas faire des jointures ?
    Parce que c'est visiblement un exercice, et qu'on lui demande explicitement de faire la requête sans jointure, mais avec des sous requêtes :


    Citation Envoyé par ZoliveR Voir le message
    r13 Qt disp par produit commandés à Poitiers ! sans jointure, avec sous-requete in(Select(..in(Select(..))

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Ah OK

    Par contre je dois être complètement débile, car je vois absolument pas l'intérêt de telles sous-requêtes...

    Autant les sous-requêtes ont un intérêt autant là...
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Ah OK

    Par contre je dois être complètement débile, car je vois absolument pas l'intérêt de telles sous-requêtes...

    Autant les sous-requêtes ont un intérêt autant là...
    Sans doute un prof débile aussi !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Les jointures sur des codes produit ça va engendrer des doublons et un besoin de DISTINCT sur la globalité de la requête, qui est un excellent indicateur d'un modèle mal maîtrisé, soit par le concepteur, soit par le développeur.

Discussions similaires

  1. [DB2 sous MVS] Requête SQL
    Par neuropathie dans le forum DB2
    Réponses: 3
    Dernier message: 19/12/2007, 09h24
  2. Problème requêtes SQL sur Access 2007
    Par Moroccan dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/02/2007, 13h29
  3. Requête SQL sur Access
    Par LadyArwen dans le forum VBScript
    Réponses: 3
    Dernier message: 18/10/2006, 15h00
  4. Sous-requêtes SQL pour ACCESS
    Par bastoon dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/08/2006, 21h41
  5. Requêtes SQL pour access
    Par cciocc dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/04/2005, 08h45

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