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 :

[Access 2000] LEFT JOIN un peu complexe


Sujet :

Langage SQL

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut [Access 2000] LEFT JOIN un peu complexe
    Bonjour,
    Je dois faire une requête portant sur 6 tables (pour l'instant parce qu'après, je devrai en intégrer 3 autres. M'enfin, ça, c'est pour plus tard).
    Pour chaque dossier, je veux toutes les infos des autres tables, sachant que les autre stables n'ont peut-êter pas les infos.
    Voilà ce que je voulais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FROM ((DOSSIER D LEFT JOIN PERSONNES P ON D.id_personne = P.id_personne)
    LEFT JOIN PARAM_TYPE_DEMANDE PTD ON D.id_type_demande = PTD.id_type_demande) 
    LEFT JOIN (DOSSIER_PARCELLE DPA 
    LEFT JOIN (PARCELLES PA LEFT JOIN LIEUDIT L ON PA.id_lieudit = L.id_lieudit )
    ON DPA.id_parcelle = PA.id_parcelle) 
    ON D.id_dossier = DPA.id_dossier
    Bon, rien n'était sélectionné. J'ai donc procédé en ajoutant table par table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM DOSSIER D LEFT JOIN PERSONNES P ON D.id_personne = P.id_personne
    ==> OK, ça roule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM (DOSSIER D LEFT JOIN PERSONNES P ON D.id_personne = P.id_personne)
    LEFT JOIN PARAM_TYPE_DEMANDE PTD ON D.id_type_demande = PTD.id_type_demande
    ==> Ok, ça roule toujours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM ((DOSSIER D LEFT JOIN PERSONNES P ON D.id_personne = P.id_personne)
    LEFT JOIN PARAM_TYPE_DEMANDE PTD ON D.id_type_demande = PTD.id_type_demande) 
    LEFT JOIN DOSSIER_PARCELLE DPA ON D.id_dossier = DPA.id_dossier
    Et là, c'est le drame! Plus rien n'est sélectionné, sachant qu'il existe bien la table DPA avec les champs cités et que ces derniers sont renseignés.
    J'ai bien essayé d'inverser la jointure LEFT avec cette table ou même de même un FULL mais toujours rien.
    Là je vois aps. Vous avez une idée?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 140
    Par défaut
    Salut,

    Je te conseil de supprimer les parenthèses.

    De plus peut tu donner la requête exacte. Si par exemple tu as un WHERE ...

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    Ma requête en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT D.id_dossier, 
                   D.reference, 
                   D.reference_daf,
                   P.nomcomplet_personne, 
                   PTD.type_demande 
    FROM DOSSIER D LEFT JOIN PERSONNES P ON D.id_personne = P.id_personne
                   LEFT JOIN PARAM_TYPE_DEMANDE PTD ON D.id_type_demande = PTD.id_type_demande  
                   LEFT JOIN DOSSIER_PARCELLE DPA  LEFT JOIN PARCELLES PA LEFT JOIN LIEUDIT L ON PA.id_lieudit = L.id_lieudit ON DPA.id_parcelle = PA.id_parcelle ON D.id_dossier = DPA.id_dossier
    WHERE D.id_dossier <> 0  
    ORDER BY D.id_dossier ;
    Les parenthèses ne sont pas nécessaires pour garder les relations entre les tables?

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Quel est ton moteur de base de données (ce ne serait pas ACCESS par hasard ?)

  5. #5
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    Médiat ==> Euuuh... Oui. Access 2000. Parce que je ne l'ai pas posté au bon endroit? (c'est une question de syntaxe SQL pourtant)
    Si c'est pour savoir comment je lance cette requête, c'est avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.lstResultats.RowSource = SQL
    Me.lstResultats.Requery

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 140
    Par défaut
    Citation Envoyé par Miss Ti
    Les parenthèses ne sont pas nécessaires pour garder les relations entre les tables?
    en effet je ne l'entendais pas comme çà, mais plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    SELECT D.id_dossier, 
                   D.reference, 
                   D.reference_daf,
                   P.nomcomplet_personne, 
                   PTD.type_demande 
    FROM DOSSIER D LEFT JOIN PERSONNES P 
    ON D.id_personne = P.id_personne
    LEFT JOIN PARAM_TYPE_DEMANDE PTD 
    ON D.id_type_demande = PTD.id_type_demande  
    LEFT JOIN DOSSIER_PARCELLE DPA  
    ON D.id_dossier = DPA.id_dossier
    LEFT JOIN PARCELLES PA 
    ON DPA.id_parcelle = PA.id_parcelle 
    LEFT JOIN LIEUDIT L 
    ON PA.id_lieudit = L.id_lieudit 
    WHERE D.id_dossier <> 0  
    ORDER BY D.id_dossier ;

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Non, c'est surtout que je crois qu'ACCESS réclame ces fameuses parenthèses qui rendent la requête illisible. Et puis je n'ai pas ACCESS pour faire des tests et t'aider intelligemment

  8. #8
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    mdevlieg ==> C'était plus joli comme requeête mais ça ne marche pas...

    Médiat ==> une suggestion pour me mettre sur la piste?

  9. #9
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Bonjour,
    En fait dans ton "from" tu induit que "DPA.id_parcelle" ne doit pas être null.
    Avec Access je pense que tu vas être forcée de faire en 2 requêtes. En gros ça devrait donner ça :

    Req1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT D.*, DPA.id_parcelle
    FROM ((DOSSIER AS D LEFT JOIN PERSONNES AS P ON D.id_Personne = P.id_personne) LEFT JOIN PARAM_TYPE_DEMANDE AS PTD ON D.id_type_demande = PTD.id_type_demande) LEFT JOIN DOSSIER_PARCELLE AS DPA ON D.id_dossier = DPA.id_dossier;
    Req2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT Req1.*
    FROM Req1 LEFT JOIN (PARCELLES AS PA LEFT JOIN LIEUDIT AS L ON PA.id_lieudit = L.id_lieudit) ON Req1.id_parcelle = PA.id_parcelle;
    Avec une belle syntaxe Access

  10. #10
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    Il y a quand même qualque chose qui ne va pas à la base puisqu'il devrait au moins me sélectionner les enregistrements dont DPA.id_parcelle n'est pas null.
    Non?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    Citation Envoyé par Miss Ti
    Il y a quand même qualque chose qui ne va pas à la base puisqu'il devrait au moins me sélectionner les enregistrements dont DPA.id_parcelle n'est pas null.
    Non?

    et si avant de faire des left join, tu fais des inner join ? Ca te sort des trucs?

    après tu fais tes jointures ouvertes au cas par cas, et tu vois où ca merde

  12. #12
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    En fait, je suis partie des INNER JOIN. Mais je me suis rapidement rendue compte que tous les dossiers n'étaient pas sélectionnés, pour peu qu'une des tables joints n'aie pas de correspondance pour le dossier en cours.
    On m'a donc dit de me renseigner sur les LEFT JOIN.
    C'est vrai que, en théorie, c'est pas con.
    Mais, en pratique, je ne m'en sort pas...
    après tu fais tes jointures ouvertes au cas par cas, et tu vois où ca merde
    C'est à dire?

  13. #13
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Sous Access 2000 :
    J'ai créé les 6 tables (simplement les champs servant aux jointures), et la requête que tu nous donnes dans ton premier message.
    J'ai saisi quelques enregistrements au pif en prenant bien garde à ce que les références soient introuvables, de manière à tester le côté externe des jointures.

    Résultat : la requête me ramène bien tous les enregistrements de la table DOSSIER.

    Bilan 1 : La solution proposée dans mon post précédent est royalement inutile
    Bilan 2 : Je n'arrive pas à reproduire ton problème et ne peux donc pas t'aider

    Je te conseille de faire comme te l'a suggéré ZERS, c'est à dire de partir de la même requête avec uniquement des jointures internes puis de les ouvrir 1 par 1 pour voir où ça pêche

  14. #14
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    Qu'entendez-vous par 'ouvrir les jointures internes'?
    Les passer de INNER à LEFT une à une?

    (Sachant que quand j'ajoute les tables une à une (voir mon 1er message) et que ça bloque quand je place la table DOSSIER_PARCELLE, je ne devrais pas plutôt me focaliser là-dessus?)

  15. #15
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Les passer de INNER à LEFT une à une?
    Oui, je n'arrive pas à comprendre que tu aies moins de résultat lorsque tu passes tes jointures internes en externes


    ça bloque quand je place la table DOSSIER_PARCELLE, je ne devrais pas plutôt me focaliser là-dessus
    Tu as raison, mais lorsque tu avais des jointures interne cette table ne posait pas de problème particulier
    Et de toutes manières ta requête semble bonne. Bref, perso je pige pas.

    A moins que je ne passe à côté de quelque chose (ce qui est très possible un vendredi soir ) , je crois que ça devient un problème Access, et ça peut alors venir de plein de chose :
    Ta table DOSSIER_PARCELLE a-t-elle quelque chose de spéciale ? S'agit-il de tables attachées ? Si oui quel est le type de la base ? Ta base access a-t-elle subit des migrations ? Si tu crées un fichier access tout neuf tout vide, que tu importes tes tables et ta requête dedans, ça donne quoi ?

  16. #16
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    Ta table DOSSIER_PARCELLE a-t-elle quelque chose de spéciale ? S'agit-il de tables attachées ? Si oui quel est le type de la base ? Ta base access a-t-elle subit des migrations ?
    Non, ma table n'a rien de spécial.
    Oui, il s'agit d'une table attachée. Elle est stockée avec les autres tables dans une autre base Access (base exploitée) afin de pouvoir modifier les requêtes et formulaires tranquilement sur la BD exploitante (celle en cours).
    Non, c'est une table qui a été patiemment remplie à la main.
    Si tu crées un fichier access tout neuf tout vide, que tu importes tes tables et ta requête dedans, ça donne quoi ?
    Vais essayer en copiant les tables puis en les liant (comme actuellement).

    Commence à me courrir sur le haricot cette requête...
    Dire qu'elle va me servir de base pour plusieurs formulaires...

  17. #17
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    Là, je pige pas
    J'ai créé ma requête en SQL (la clause FROM est la première que je vous avait indiquée) et l'ai appliquée dans
    1/ une nouvelle base où j'avais copié mes tables
    2/ une nouvelle base où j'avais lié mes tables
    et à chaque fois ça m'avait sélectionné 1267 enregistrements au lieu de rien.
    What happens?

  18. #18
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Ca arrive parfois avec Access, et ça arrivait déjà dans la version 97. J'ai remarqué que le risque d'être confronté au problème augmente lors de l'imbrication de requêtes sur des tables attachées, lors des migrations techniques, ...
    Finalement tout fonctionne maintenant ?

  19. #19
    Membre éclairé

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Par défaut
    C'est bon à savoir.
    Oui, ça marche mais j'ai pas compris pourquoi le fait de virer toutes les tables liées et de les remettre en place a changé quelque chose.
    Merci à tous.

  20. #20
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Oui, ça marche mais j'ai pas compris pourquoi le fait de virer toutes les tables liées et de les remettre en place a changé quelque chose.
    En fait il t'a suffit de refaire les attaches des tables alors ?
    Dans ce cas là le problème peut simplement venir du fait que tu aies modifier la structure des tables sans refaire les attaches. Il faut toujours réattacher les tables lorsque leur structure bouge.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. SQL LEFT JOIN et formulaires Access
    Par AceSonyx dans le forum Access
    Réponses: 5
    Dernier message: 16/06/2014, 09h11
  2. Réponses: 4
    Dernier message: 22/04/2013, 12h00
  3. Access 2000 - plusieurs inner join
    Par kekesilo dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/04/2008, 18h36
  4. [Access] Requête avec LEFT JOIN et 3 tables
    Par estelledany dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/06/2006, 13h27
  5. [Access 2000] Faire un INNER JOIN derrière un LET JOIN
    Par Korskarn dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/03/2006, 11h51

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