Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/02/2011, 11h09   #1
Nom
Membre habitué
 
Inscription : octobre 2005
Messages : 528
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 528
Points : 143
Points : 143
Par défaut Jointure sur une seule table

Bonjour à tous
J'ai quelque difficulté à écrire une requête donc j'apprécierai votre aide.

Tout d'abord voici les colonnes de la tables qui nous intéresse :

marquage : texte
ville : texte
nom : texte
reference: texte

et voici un exemple de lignes possibles :
Code :
1
2
3
4
5
6
7
marquage    ville      nom        reference
L01         Paris     Dupond       A1 / A2
L02         Paris     Dupond       A1
L03         Paris     Dupond       A6
T01                                A1
T02                                B1
T03                                A1
Ce que j'aimerai, c'est comparer les lignes dont le marquage commence par L et donc la référence correspond à une ligne dont le marquage commence par T (les informations après le / du marquage ne doivent pas être pris en compte)

Donc si je reprend mon exemple ci dessus, j'aimerai obtenir un résultat de cette forme :
Code :
1
2
3
4
marquage    ville      nom        reference    marquage_T*
L01         Paris     Dupond       A1 / A2       T01; T03
L02         Paris     Dupond       A1            T01; T03
L03         Paris     Dupond       A1
Explication du résultat attendu :
- Pour la ligne L01, : 2 lignes dont le marquage commence par T correspondent (T01 et T03 ont un marquage A1 ce qui correspond à A1 /A2 )
- Pour la ligne L02, : 2 lignes dont le marquage commence par T correspondent (T01 et T03 ont un marquage A1 ce qui correspond à A1)
- Pour la ligne L03 : aucune ligne dont le marquage commence par un T ne correspond (A6 <> A1 et A6 <> B1)


Pour le moment, je suis passé par un script vba mais je pense qu'une solution SQL serait plus adapté et plus performante

Merci d'avance
__________________
Le savoir est une arme alors soyons armés
Nom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 11h21   #2
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Nom,

Ta question est beaucoup plus complexe qu'il n'y paraît... et non moins intéressante.

En fait, il faut passer par plusieurs requêtes (eh oui, tout ne se résoud pas, forcément, en une seule requête). Voici ma suggestion (via l'assistant) :

Requête R1 :
- ajouter TaTable (FROM) ;
- ajouter tous les champs (SELECT) ;
- Critères : marquage Comme "L*".
==> liste, uniquement, les enregistrements de TaTable dont le marquage commence par "L".

Requête R2 :
- ajouter TaTable (FROM) ;
- ajouter tous les champs (SELECT) ;
- Critères : marquage Comme "T*".
==> liste, uniquement, les enregistrements de TaTable dont le marquage commence par "T".

Requête R3 :
- ajouter R1 et R2 (FROM) ;
- lier R1 et R2, via "reference" ;
- ajouter les champs que tu souhaites (SELECT).
==> lie, sur elle-même, TaTable par les mêmes références.

Ensuite, il faudra passer par une requête "analyse croisée" pour que les "T*" soient sur une même ligne : je te propose de voir cela après.

En attendant, si tu veux, étudies le résultat de cette opération.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 13h27   #3
Nom
Membre habitué
 
Inscription : octobre 2005
Messages : 528
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 528
Points : 143
Points : 143
Bonjour et merci pour ta réponse.

En effet, ce que tu me proposes fonctionne pour les lignes dont la référence correspond exactement à une autre référence. (ligne L02)
Par contre pour la ligne L01, je n'ai pas de résultat.

Avec ta solution j'ai le résultat suivant

Code :
1
2
marquage    ville      nom        reference    marquage_T*
L02         Paris     Dupond       A1            T01
En remplaçant dans le code SQL, le INNER JOIN par un LEFT JOIN, j'obtiens ceci :
Code :
1
2
3
4
marquage    ville      nom        reference    marquage_T*
L01         Paris     Dupond       A1/A2              
L02         Paris     Dupond       A1            T01  
L03         Paris     Dupond       A1
Donc il me faudrait une jointure avec un ON R1.marquage like R2.marquage mais à priori, ce n'est pas possible ...
Ou alors splitter directement la valeurs de la colonne ?


EDIT : J'ai essayé avec la fonction MID et ça semble être bon
Si je simplifie ma requête, elle ressemble à ça :
Code sql :
1
2
3
SELECT r1.marquage, r1.ville, r1.nom, r1.reference,r2.marquage
FROM r1 LEFT JOIN r2
ON MID(r1.reference, 1,2) = MID(r2.reference, 1,2)

Cela fonctionne mais la longueur de chaine (ici 2) peit ammener des erreurs/incohérences . A priori, access ne connait pas SPLIT ni STRSTR. Auriez vous une solution ?
__________________
Le savoir est une arme alors soyons armés
Nom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 14h29   #4
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Ah oui, c'est exact.

Le "split" existe, mais en VBA (je ne connais pas VBA).

Pour les références mixtes de type "A1 / A2", quel est le maximum d'éléments (séparés par " / ", donc) ?
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 15h06   #5
Nom
Membre habitué
 
Inscription : octobre 2005
Messages : 528
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 528
Points : 143
Points : 143
Il n'y a pas vraiment de nombre maximum définis.
Mais tant pis sinon j'ai une requête + un script VBA, ça devrait suffire ^^
__________________
Le savoir est une arme alors soyons armés
Nom est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h51.


 
 
 
 
Partenaires

Hébergement Web