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 requête imbriquée


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut Problème requête imbriquée
    Bonjour,
    L'application en question est développée en VB6 et les données sont stockées sous une base Access.

    La requête que je tente d'utiliser fonctionne très bien sous Access mais lorsque je tente de l'exécuter depuis l'application, j'ai une erreur :

    vous avez écrit une sous-requête pouvant renvoyer plus d'un champ sans utiliser le mot réservé EXISTS pour la clause FROM de la requête principale.
    Ma sous requête possède bien un seul champ de retour, et vu que j'utilise un SUM(), je n'aurais qu'une seule ligne normalement.

    Quelqu'un à idée pour contourner le problème ?

    Voici la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT abo.abo_bat_lieudit, First(parcelles.parc_section) AS [Section], First(parcelles.parc_num_cadas) AS [Numéro cadastral], abo.abo_bat_type_residence, abo.abo_type, abo.abo_qualite, abo.abo_prenom, abo.abo_nom, abo.abo_fact_adresse, abo.abo_fact_cp, abo.abo_fact_ville, abo.abo_bat_adresse, abo.abo_bat_cp, Mid(abo_reference,7,5) AS [Ordre de passage], '' AS Visite, (SELECT Sum(reponses_NAE.valeur) AS Total FROM visites INNER JOIN (reponses_NAE INNER JOIN visites_reponses_NAE ON reponses_NAE.reponse_id = visites_reponses_NAE.reponse_id) ON visites.vis_id = visites_reponses_NAE.vis_id GROUP BY visites.vis_id, visites.vis_id Having visites.vis_id = last(visites2.vis_id)) AS [Note agence de l'eau], '' AS Priorité, abo.id_abonne, last(visites2.vis_date) AS [Dernière visite], abo.abo_ass_filiere
    FROM visites AS visites2 INNER JOIN (parcelles RIGHT JOIN ((abo LEFT JOIN parcelles_abo ON abo.id_abonne = parcelles_abo.id_abonne) INNER JOIN visites_abos ON abo.id_abonne = visites_abos.id_abonne) ON parcelles.parc_id = parcelles_abo.parc_id) ON visites2.vis_id = visites_abos.vis_id
    GROUP BY abo.abo_bat_lieudit, abo.abo_bat_type_residence, abo.abo_type, abo.abo_qualite, abo.abo_prenom, abo.abo_nom, abo.abo_fact_adresse, abo.abo_fact_cp, abo.abo_fact_ville, abo.abo_bat_adresse, abo.abo_bat_cp, abo.id_abonne, abo.abo_ass_filiere, abo.abo_bat_ville, abo.abo_reference, visites2.vis_id
    Merci de votre lecture,
    Alexandre.

    PS : Désolé si la rubrique n'est pas la bonne.

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    es tu sur que cette requete fonctionne dans access?
    car le SUM() aura du mal à ne renvoyer qu'un seul enregistrement vu que tu fais un GROUP BY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY visites.vis_id, visites.vis_id
    qui soit dit en passant ne sert à rien d'être aussi doublé.
    revoit la logique de ta requete sans ce 'group by'.
    sinon essaie de revoir avec la fonction de domaine: DSum (si c'est possible...) qui garanti l'unicité de la valeur.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    Bonjour,
    Ma requête imbriquée ressort une espece de note pour le client. Cette note est calculé via différentes tables. Pour calculer cette note je suis obligé de faire un GROUP BY.

    Pour ce qui est de la requête principale, je ressors qu'un élément lié au client (?! ex : dernière visite, utilisation de Last). Donc à priori le second GROUP BY est obligatoire.

    Ma requête fonctionne bien sous Access (2007 au passage). Après la requête fonctionne parce que je n'ai toujours qu'un seul résultat pour l'instant.

    Je n'ai pas très bien compris l'utilisation du DSum. Le domaine correspond à quoi exactement ? Champ sur lequel on fait le SUM ?

    Merci de ton aide en tout cas !
    Cordialement,
    Alexandre

  4. #4
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    essaie avec:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    dsum("valeur","reponses_nae","vis_id="+cstr(dlast("vis_id","visites")))
    à la place de ton sum.
    il y a une différence mais je ne pense pas qu'elle te soit préjudiciable;
    si tu n'as pas le card(vis_id) de [reponses_nae] <> card(vis_id) de [visites_reponses_NAE] sinon il faudra faire une adaptation.

    les fonctions de domaine renvoie une et une seul valeur d'après des critères à partir d'une table/requete. le domaine est donc la table/requete.

    Pour ce qui est de la requête principale, je ressors qu'un élément lié au client (?! ex : dernière visite, utilisation de Last). Donc à priori le second GROUP BY est obligatoire.
    le group by c'est surtout pour renvoyer plusieurs enregistrements en fonction des différentes valeurs d'un champ.
    pour la requete principale cela ne pose pas de pb mais mis dans un champ (et mal exploité) ca fait tâche si elle peut renvoyer plusieurs enregistrements...

    je n'ai pas approfondi la lecture de la requete, je réponds principalement à
    Quelqu'un à idée pour contourner le problème ?
    j'espère que cela t'aideras.

Discussions similaires

  1. Problème requête imbriquée?
    Par mad_martigan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/02/2009, 10h58
  2. [MySQL] Problème requête imbriquée
    Par Little_flower dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 21/08/2007, 18h58
  3. Problème requêtes imbriquées
    Par jean-paul lepetit dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 20/03/2007, 10h32
  4. Problème Requête Imbriquée
    Par PaulPersonne820 dans le forum Hibernate
    Réponses: 1
    Dernier message: 31/01/2007, 22h40
  5. Problème Requête imbriquée
    Par EddieN dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/10/2006, 07h52

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