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 :

Requête couplée à un état: alias, outer join et group by


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    analyste-programmeur
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : analyste-programmeur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Par défaut Requête couplée à un état: alias, outer join et group by
    Bonjour, bonjour,
    Je bloque sur un problème qui me dépasse un peu.
    Je veux faire un état à partir d'une table enquête donc la clé est multiple: un ID famille, un code et un flag qui est un booléen.
    Dans cette table on a deux jeux de données, un avec le booléen à vrai, un autre avec le booléen à faux.
    Donc, je fais une requête avec outer join de la table enquête sur elle même comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.[Valeur], b.[Valeur]
    FROM enquete AS a LEFT JOIN (SELECT * FROM enquete WHERE enquete.flag <>-1)  AS b ON (a.Code = b.Code) AND ([a].[ID Number] = [b].[ID Number])
    WHERE a.flag=-1;
    Ce qui marche bien.
    Maintenant, je souhaite afficher en en-tête de mon état les données de la famille (nom, enquêteur, zone géographique...) qui viennent de la table famille.
    Là, j'ai eu un peu plus de mal et mon résultat est tout vilain (je vous passe l'intégralité du truc):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT a.Valeur, b.Valeur,
        (SELECT Famille.[ID number] FROM Famille WHERE a.[ID number] = famille.[ID number]) AS familyID,
        (SELECT Famille.nom FROM Famille WHERE a.[ID number] = Famille.[ID number]) AS familyName,
    ... (me chose pour les autres champs venant de famille ou les description nécessaire du code et de la valeur)
    FROM enquete AS a LEFT JOIN (SELECT * FROM enquete WHERE enquete.flag <>-1)  AS b ON (a.Code = b.Code) AND ([a].[ID Number] = [b].[ID Number])
    WHERE a.flag=-1;
    C'est moche, mais ça me donne le jeu de données que je veux.
    Donc, pour ma requête, je suis satisfait.
    Maintenant, je passe à mon état, et là, patatras!
    Si je mets les données venant de famille en en-tête et le tableau des codes et valeurs en détail du rapport, j'ai une erreur à l'exécution:
    "Clause GROUP BY multi-niveau non autorisée dans une sous-requête"
    Ce que, intuitivement je comprends (peut-être).
    Dans ma requête, je n'ai pas regroupé les données venant de famille dans un group by.
    Mais là, j'avoue que je suis perdu.
    Quelqu'un peut-il m'aider?
    Merci

  2. #2
    Membre averti
    Homme Profil pro
    analyste-programmeur
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : analyste-programmeur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Par défaut
    Je chercher, je cherche.
    J'ai essayé ça, piqué sur un site quelque part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT Famille.[ID number],
                Famille.nom,
                Famille.zoneGeo,
                Famille.nMembres,
                a.Valeur,
                b.Valeur
    FROM enquete AS a LEFT JOIN (SELECT * FROM enquete WHERE enquete.flag <>-1)  AS b ON ([a].[ID Number] = [b].[ID Number] AND a.Code = b.Code),
                a JOIN Famille ON a.[ID number] = Famille.[ID number]
    WHERE a.flag = -1;
    Mais ça marche pas non plus.
    Access me dit "Expression JOIN non supportée".

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 305
    Billets dans le blog
    48
    Par défaut
    bonjour,

    il y a des astuces qui marchent parfois...

    rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...UNION ALL SELECT NULL, NULL,NULL,NULL FROM T1 WHERE False;
    ou plus simplement avec un SELECT DISTINCT ...

  4. #4
    Membre averti
    Homme Profil pro
    analyste-programmeur
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : analyste-programmeur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Par défaut
    Bon, je patine toujours dans la choucroute.
    J'ai testé avec DISTINCT comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT Famille.[ID number],
                Famille.nom,
                Famille.zoneGeo,
                Famille.nMembres,
    (SELECT [a].Valeur FROM enquete AS a WHERE (a.[ID number] = Famille.[ID number] AND [a].flag=-1)) AS aDetailValue
    FROM Families;
    Cette requête marche. (Je ne suis pas encore allé vérifier si je pouvais m'en servir dans l'état.)

    Par contre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT DISTINCT Famille.[ID number],
                Famille.nom,
                Famille.zoneGeo,
                Famille.nMembres,
    (SELECT [a].Valeur FROM enquete AS a WHERE (a.[ID number] = Famille.[ID number] AND [a].flag=-1)),
    (SELECT b.Valeur FROM a LEFT JOIN (SELECT * FROM enquete WHERE enquete.flag <>-1)  AS b ON ([a].[ID Number] = [b].[ID Number] AND [a].Code = [b].Code))
    FROM Families;
    Ne marche pas. J'ai le message suivant:
    "Le moteur de Base de données Microsoft Office Access ne peut pas trouver la table ou la requête source "a". Assurez-vous qu'elle existe et qu'elle est correctement orthographié."

    J'ai le sentiment de ne pas être très loin du but.
    Ou bien j'ai vachement tout faux?
    Merci de votre aide

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 305
    Billets dans le blog
    48
    Par défaut
    Citation Envoyé par fabOK Voir le message
    "Le moteur de Base de données Microsoft Office Access ne peut pas trouver la table ou la requête source "a". Assurez-vous qu'elle existe et qu'elle est correctement orthographié."
    Dans la 2ème requête, normal. L'alias [a] est défini uniquement pour la sous-requête de la ligne 6. La sous-requête de la ligne 7 est évaluée à part.

    Je reste quand même convaincu que ce genre de requête peut se traiter uniquement avec les assistants, quitte à passer par une ou deux requêtes intermédiaires.

Discussions similaires

  1. Construction requête : problème avec un LEFT OUTER JOIN
    Par riomois85 dans le forum Développement
    Réponses: 6
    Dernier message: 22/08/2014, 15h25
  2. Requête complexe avec des LEFT OUTER JOIN
    Par bella125 dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/04/2014, 12h51
  3. Problème left outer join et group by
    Par maya13400 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/09/2010, 21h40
  4. [DML]Fusion de deux requêtes full Outer join colonne null
    Par peuplier dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/01/2009, 16h22
  5. left outer join et group by
    Par pobrouwers dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/11/2007, 14h58

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