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

Requêtes et SQL. Discussion :

Problème pour imbriquer des requêtes [AC-2003]


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Février 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 198
    Par défaut Problème pour imbriquer des requêtes
    Bonjour à tous,

    je rencontre un problème pour imbriquer deux requêtes, depuis ce matin je teste des solutions en m'aidant d'exemples trouvés ici et sur le net, mais rien à faire, je n'y arrive pas

    Je recherche à éviter l'utilisation de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE NOT IN (requete...)
    qui n'est pas optimisé (mais qui fonctionne néanmoins !)

    Voilà la requête qui fonctionne avec la solution NOT IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT tabArticles.idArticle, tabArticles.Article
    FROM tabArticles
    WHERE tabArticles.idArticle Not In (SELECT tabListes.refIdArticle
    FROM tabListes
    WHERE tabListes.refIdCourse=38);
    J'ai lu que la parade pour ne pas utiliser la fonction NOT IN consistait à calculer le nombre d'article présent dans une première requête et filtrer dans une deuxième requête tous les articles ayant un nombre différent de zéro.

    En m'aidant de l'éditeur de requêtes d'ACCESS, j'ai réussi à faire ceci :
    1) j'ai créé une requête que j'ai enregistré (reqArticleFiltreParCourse) qui sélectionne dans la tabListe tous les articles correspondant à l'IdListe que je choisi (ici 38)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tabListes.refIdArticle
    FROM tabListes
    WHERE (((tabListes.refIdCourse)=38));
    2) je crée une seconde requête qui utilise la tabArticles mais aussi ma première requête reqArticleFiltreParCourse.
    Cette requête compte tous les articles et sélectionne tous les articles qui ont pour valeur Nbre=0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Count(reqArticleFiltreParCourse.refIdArticle) AS CompteDerefIdArticle, tabArticles.idArticle, tabArticles.Article
    FROM tabArticles LEFT JOIN reqArticleFiltreParCourse ON tabArticles.idArticle = reqArticleFiltreParCourse.refIdArticle
    GROUP BY tabArticles.idArticle, tabArticles.Article
    HAVING (((Count(reqArticleFiltreParCourse.refIdArticle))=0));
    Ca fonctionne aussi

    Maintenant, j'aimerais pour regrouper ces deux requêtes en une seule, afin de pouvoir la manipuler plus simplement en vba.

    Pour l'instant, je suis arrivé à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tabArticles.idArticle, tabArticles.Article, tabListes.refIdCourse, Count(tabListes.refIdArticle) AS CompteDerefIdArticle
    FROM tabArticles LEFT JOIN tabListes ON tabArticles.idArticle = tabListes.refIdArticle
    GROUP BY tabArticles.idArticle, tabArticles.Article, tabListes.refIdCourse;
    mais je n'arrive pas à passer mes critères tabListes.refIdCourse=38 et Count(tabListes.refIdArticle))=0 car ça ne me retourne pas le bon résultat.
    Sans doute parce que mes jointures sont mal écrites, mais malgré mes tentatives et les exemples que j'ai suivi, je n'arrive pas à comprendre la logique.

    Quelqu'un peut m'aider ?

    Merci,

    Jean-Marc

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 127
    Par défaut
    Bonjour,

    Voici une variante qui est peut-être plus optimisée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tabArticles.*
    FROM tabArticles left join tabListes on (tabArticles.idArticle=tabListes.refIdArticle and tabListes.refIdCourse=38)
    WHERE isnull(tabListes.refIdArticle)
    A dire vrai je ne suis pas sûr que ça marche avec un lien sur une constante...Par contre ça marche en remplaçant tabListes par reqArticleFiltreParCourse

    Avec des count et des requêtes en cascade à l'évidence c'est encore moins optimisé

    Sinon, where not exists marche aussi mais ça ressemble à ta 1ere version...

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Février 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 198
    Par défaut
    Merci beaucoup, ta solution fonctionne à merveille Pas besoin de passer par des COUNT, c'est beaucoup plus simple ainsi !

    En fait, je ne savais pas qu'on pouvait mettre plusieurs choses après un ON, pas plus qu'on pouvait mettre une égalité dans cette partie là du code SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON (tabArticles.idArticle=tabListes.refIdArticle and tabListes.refIdCourse=38)
    D'ailleurs, il n'est pas possible de d'avoir cette requête en mode édition dans le générateur de requêtes Access.

    Merci encore pour cette rapide réponse.

    Jean-Marc

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

Discussions similaires

  1. Problème pour relier des sous-requêtes
    Par chart dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/07/2014, 14h00
  2. [XML word] problème pour créer des puces
    Par ratapapa dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/07/2005, 13h52
  3. Problème pour Télécharger des fichiers
    Par joce3000 dans le forum C++Builder
    Réponses: 8
    Dernier message: 21/01/2005, 10h30
  4. problème pour faire des blocs
    Par tinkye_winkye dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 04/01/2005, 14h13
  5. Recherche ibrairie pour éxécuter des requêtes SQL via C++
    Par daemon dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 14/06/2004, 10h28

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