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 :

Simplication d'une requête "trop complexe"


Sujet :

Requêtes et SQL.

  1. #1
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut Simplication d'une requête "trop complexe"
    Bonjour,
    je reprend un projet là, je ne suis pas un pro d'access et lorsque j'execute une requête, tant que ça renvoie 0 lignes pas de pb, mais dès que c'est sensé renvoyer une ligne j'ai le message d'erreur suivant :

    Cette expression contient une erreur de syntaxe ou est trop complexe pour être évaluée (...) Essayez de la simplifier (...)
    Je ne m'étonne pas qu'elle soit trop compliqué puisqu'il y a 5 Inner Join imbriqué et deux calculs d'agrégats et deux paramètres dans le lot...

    Les tables sont : A,B,C,D,E,F,G
    chaque table a une relation 1 à n avec la suivante et aucune autre

    il y en calculs une multiplication à faire entre 2 champs de la table D et ce résultat est additionné avec un champ de la table E
    plus en affichage un ou deux champs de chaque table ABCDEF

    Tout est pour l'instant écrit avec des Inner Join imbriqués, y a t il moyen de simplifier cette requête Svp ?

    Merci d'avance

    EDIT : Lorsque cette requête est utilisée dans un formulaire (les paramètres sont les valeurs de 2 combobox) le message d'erreur change et est :
    Erreur 3420 : L'objet est incorrect ou n'est pas défini

  2. #2
    Membre averti

    Inscrit en
    Août 2005
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 220
    Points : 364
    Points
    364
    Par défaut requête trop complexe
    Peux-tu nous montrer le code de ta requête ?

    Car j'ai déjà fait en Access des requêtes sur une dizaine de tables... Le problème est ailleurs (une référence circulaire par exemple)

  3. #3
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Pour des raisons de confidentialité j'ai préféré renommer mes tables, j'espère que ça ne posera pas de souci pour la résolution du pb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    A.numero, B.numero, B.libelle, C.nom, D.numero, Concatener_Personne(E.nomC,E.numD) AS personnes, Sum([jours]*[taux]) AS somme, E.frais, [somme]+[frais] AS total
    FROM 
    ((A LEFT JOIN B ON A.numero=B.NumA) LEFT JOIN (C LEFT JOIN D ON C.nom=D.nomC) ON (B.numA=C.numA) AND (B.numero=C.numB)) LEFT JOIN E ON (D.numero=E.numD) AND (D.nomC=E.numD)
    GROUP BY 
    A.numero, B.numero, B.libelle, C.nom, D.numero, Concatener_Personne(E.nomC,E.numD) AS personnes, Sum([jours]*[taux]) AS somme, E.frais, [somme]+[frais] AS total,
    Month([dateX]), Year([dateX]), D.Etat
    HAVING 
    (((Month([dateX]))=Formulaires!Facture!mois) And ((Year([dateX]))=Formulaires!Facture!annee) And ((D.etat)="OK"));
    Ne tenez pas compte des noms des champs, j'ai renommé ça en vitesse.
    Merci

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    c vrai qu'avec la requète c'est plus facile à travailler.

    mais en toute logique, "inner join" tu peux remplacer par "," Et "on" par "Where" pour le 1er et "And" pour les suivant

    n'oublis pas que dans le "From" toutes les table doivent y être mais rien de ce qu'il y a après les "on", seulement ce qui suis immédiatement le "inner join",
    dans le "Where ... And" tous ce qu'il y a après les "on"

    si c confut, post la requète j'essayerais de faire un simplification...

    le temps de poster ces déjà là dsl

  5. #5
    Membre averti

    Inscrit en
    Août 2005
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 220
    Points : 364
    Points
    364
    Par défaut requête complexe
    Première erreur que je remarque dans ton code:
    le Sum([jours]*[taux]) AS somme ne doit pas être reprise dans le group by (puisque ce champ est déjà dans une fonction d'agrégation). De même, vire les alias des champs dans ton group by, ça clarifiera les choses

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    SELECT A.numero, B.numero, B.libelle, C.nom, D.numero, Concatener_Personne(E.nomC,E.numD) AS personnes, Sum([jours]*[taux]) AS somme, E.frais, [somme]+[frais] AS total
    FROM A LEFT JOIN B LEFT JOIN C LEFT JOIN D LEFT JOIN E
    WHEREA.numero=B.NumA
    AND C.nom=D.nomC
    AND B.numA=C.numA
    AND B.numero=C.numB
    AND D.numero=E.numD
    AND D.nomC=E.numD
    GROUP BY A.numero, B.numero, B.libelle, C.nom, D.numero, Concatener_Personne(E.nomC,E.numD), E.frais, [somme]+[frais], Month([dateX]), Year([dateX]), D.Etat
    HAVING (((Month([dateX]))=Formulaires!Facture!mois) And ((Year([dateX]))=Formulaires!Facture!annee) And ((D.etat)="OK"));

    je peux te proposer cela mais pas sur que sa marche, inner join <> de left join

    de plus avec tes erlation sa aurais été plus simple...

    contener_personne c'est quoi?? ce que sa fait je comprend, mais je ne croi pas qu'il existe de fonction concatener_personne...

  7. #7
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Comme je disais dans le premier post, les relations sont toutes des relations 1 à n comme suit :

    A->B->C->D->E->F

    Quand à la fonction Concatener personnes il s'agit d'une fonction VBA dans un module de la base, et en gros elle boucle sur la table E et écrit toutes les personnes concernées par la ligne en cours de la requête séparés par une virgule.

  8. #8
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Merci ben_skywalker j'ai modifié la syntaxe comme tu l'a conseillé, et la requête fonctionne !

    Merci beaucoup aux autres aussi

    EDIT : Au lieu de mettre A LEFT JOIN B LEFT JOIN C LEFT JOIN D LEFT JOIN E
    j'ai écris A,B,C,D,E

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

Discussions similaires

  1. une requête multiple trop compliquée pour moi
    Par Invité dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/08/2010, 22h38
  2. Réponses: 6
    Dernier message: 25/09/2009, 11h10
  3. Construction d'une requête un peu complexe
    Par dauphin34000 dans le forum SQL
    Réponses: 9
    Dernier message: 24/05/2007, 11h43
  4. Création d'une requête un peu complexe
    Par vpicchi dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/01/2007, 21h52

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