Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

« INNER JOIN ON »

12 réponses
Avatar
Philippe Dhondt
Bonjour



Comment faire un INNER JOIN ou l'on ne cherche pas une concordance parfaite
entre les deux champs utilisés mais où une concordance partielle est
suffisante ?



Je m'explique avec un exemple :



SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo

FROM [T_SBF_250]

INNER JOIN [T_GOU_Titre] ON [T_SBF_250].Nom = [T_GOU_Titre].Titre

ORDER BY [T_GOU_Titre].Titre;



Dans cet exemple, seuls les enregistrements où le champ « [T_SBF_250].Nom »
est rigoureusement identique au champ « [T_GOU_Titre].Titre » sont
sélectionnés. Or, ce qui m'intéresse, c'est de selectionner tous les
enregistrements pour lesquels il y a au minimum trois lettres consecutives
qui sont identiques.





Merci à toutes et tous





Philippe Dhondt

10 réponses

1 2
Avatar
Eric
Bonjour,

Pa sur de répondre exactement à ton problème mais ...

Je ne crois pas que cela soit possible avec inner join, il faut revenir
à du SQL (norme86) en faisant la condition de jointure sur la clause WHERE.

Ca donnerait :
SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250], [T_GOU_Titre]
WHERE [T_SBF_250].Nom like '*' & [T_GOU_Titre].Titre & '*'
;

(A vérifier qui est contenu dans quoi !)

Pour 3 lettres consécutives ... !!! Sacré problème
je pense qu'il te faut construire une fonction perso dès lors que ces 3
lettres peuvent apparaitre n'importe où dans Nom et Titre.
Exemple Nom= forESTier et Titre = admonESTer (les 3 lettres 'EST')
qui devra retourner VRAI ou FAUX suivant la présence des 3 lettres dans
les 2 champs



Bonjour



Comment faire un INNER JOIN ou l'on ne cherche pas une concordance parfaite
entre les deux champs utilisés mais où une concordance partielle est
suffisante ?



Je m'explique avec un exemple :



SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo

FROM [T_SBF_250]

INNER JOIN [T_GOU_Titre] ON [T_SBF_250].Nom = [T_GOU_Titre].Titre

ORDER BY [T_GOU_Titre].Titre;



Dans cet exemple, seuls les enregistrements où le champ « [T_SBF_250].Nom »
est rigoureusement identique au champ « [T_GOU_Titre].Titre » sont
sélectionnés. Or, ce qui m'intéresse, c'est de selectionner tous les
enregistrements pour lesquels il y a au minimum trois lettres consecutives
qui sont identiques.





Merci à toutes et tous





Philippe Dhondt






--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
david
Salut,

tu peux faire un truc du style
SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250]
INNER JOIN [T_GOU_Titre] ON Left([T_SBF_250].Nom,3) Left([T_GOU_Titre].Titre,3)
ORDER BY [T_GOU_Titre].Titre;

ou toute autre fonction de calcul entre tes deux champs de jointure.
Toutefois, attention, le temps de calcul devient vite grand si les
calculs en jointure sont trop important...

A+
Avatar
Eric
...

Si pour les 3 lettres, tu acceptes qu'il faut sortir les enregistrements
de nom qui contiennent au moins les 3 premieres lettres de titre,
n'importe où dans Nom, alors tu peut faire ça de la manière suivante:
SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250], [T_GOU_Titre]
WHERE [T_SBF_250].Nom like '*' & [T_GOU_Titre].Titre & '*'
AND Len([T_GOU_Titre].Titre)>=3

Bonjour,

Pa sur de répondre exactement à ton problème mais ...

Je ne crois pas que cela soit possible avec inner join, il faut revenir
à du SQL (norme86) en faisant la condition de jointure sur la clause WHERE.

Ca donnerait :
SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250], [T_GOU_Titre]
WHERE [T_SBF_250].Nom like '*' & [T_GOU_Titre].Titre & '*'
;

(A vérifier qui est contenu dans quoi !)

Pour 3 lettres consécutives ... !!! Sacré problème
je pense qu'il te faut construire une fonction perso dès lors que ces 3
lettres peuvent apparaitre n'importe où dans Nom et Titre.
Exemple Nom= forESTier et Titre = admonESTer (les 3 lettres 'EST')
qui devra retourner VRAI ou FAUX suivant la présence des 3 lettres dans
les 2 champs





--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Pierre CFI [mvp]
salut eric, pas tout suivi mais y manque pas un left qq part ?

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
Access http://users.skynet.be/mpfa/

"Eric" a écrit dans le message de news:
...

Si pour les 3 lettres, tu acceptes qu'il faut sortir les enregistrements de nom qui contiennent au moins les 3 premieres lettres
de titre, n'importe où dans Nom, alors tu peut faire ça de la manière suivante:
SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250], [T_GOU_Titre]
WHERE [T_SBF_250].Nom like '*' & [T_GOU_Titre].Titre & '*'
AND Len([T_GOU_Titre].Titre)>=3

Bonjour,

Pa sur de répondre exactement à ton problème mais ...

Je ne crois pas que cela soit possible avec inner join, il faut revenir à du SQL (norme86) en faisant la condition de jointure
sur la clause WHERE.

Ca donnerait :
SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250], [T_GOU_Titre]
WHERE [T_SBF_250].Nom like '*' & [T_GOU_Titre].Titre & '*'
;

(A vérifier qui est contenu dans quoi !)

Pour 3 lettres consécutives ... !!! Sacré problème
je pense qu'il te faut construire une fonction perso dès lors que ces 3 lettres peuvent apparaitre n'importe où dans Nom et
Titre.
Exemple Nom= forESTier et Titre = admonESTer (les 3 lettres 'EST')
qui devra retourner VRAI ou FAUX suivant la présence des 3 lettres dans les 2 champs





--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Eric
Bonjour Pierre,

Si on met un Left(), alors il ne sera plus possible de répondre à : "ce
qui m'intéresse, c'est de selectionner tous les enregistrements pour
lesquels il y a *au minimum* trois lettres consecutives qui sont
identiques." car LEFT va imposer de définir le nb de caractères à prendre.

Donc je précisais que ca ne pourrait fonctionner que pour les n
premieres lettres de Titre avec n >=3. (Bien que la formulation était 3
lettres consécutives, c'est pourquoi, j'avais mis 'Sacré problème')

Sur un exemple c'est plus clair : on veut retrouver tous les Noms qui
contiennent *au moins* les 3 premiers caractères de Titre
Table1 Table2
NOM TITRE
toto oto
tata iti
tutu otorino
titi toto
outro ot
oto-rhino utu
loto
turlututu

Ma requête renvoie:
NOM TITRE
loto oto
oto-rhino oto
titi iti
toto oto
toto toto
turlututu utu
tutu utu

(Pour ne pas voir en double ou plus les enregistrements comme toto dans
la requête il suffit de ne pas demander TITRE dans le Select.)

Mais, il est fort possible que je n'ai pas compris le problème, vu mon
grand age ça ne serait pas étonnant ;-)

Qu'en penses-tu ?

salut eric, pas tout suivi mais y manque pas un left qq part ?



--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Pierre CFI [mvp]
euh, prudent , je répondrais "chacun sa m...e" :o)

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
Access http://users.skynet.be/mpfa/

"Eric" a écrit dans le message de news:
Bonjour Pierre,

Si on met un Left(), alors il ne sera plus possible de répondre à : "ce qui m'intéresse, c'est de selectionner tous les
enregistrements pour lesquels il y a *au minimum* trois lettres consecutives qui sont identiques." car LEFT va imposer de définir
le nb de caractères à prendre.

Donc je précisais que ca ne pourrait fonctionner que pour les n premieres lettres de Titre avec n >=3. (Bien que la formulation
était 3 lettres consécutives, c'est pourquoi, j'avais mis 'Sacré problème')

Sur un exemple c'est plus clair : on veut retrouver tous les Noms qui contiennent *au moins* les 3 premiers caractères de Titre
Table1 Table2
NOM TITRE
toto oto
tata iti
tutu otorino
titi toto
outro ot
oto-rhino utu
loto
turlututu

Ma requête renvoie:
NOM TITRE
loto oto
oto-rhino oto
titi iti
toto oto
toto toto
turlututu utu
tutu utu

(Pour ne pas voir en double ou plus les enregistrements comme toto dans la requête il suffit de ne pas demander TITRE dans le
Select.)

Mais, il est fort possible que je n'ai pas compris le problème, vu mon grand age ça ne serait pas étonnant ;-)

Qu'en penses-tu ?

salut eric, pas tout suivi mais y manque pas un left qq part ?



--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Rv
Salut,

Une piste :

Avec la fonction suivante contenu dans un module standard :

' 3 lettres consecutives de strChercheQuoi dans strChercheOu
Public Function comprend(strChercheQuoi As String, strChercheOu As String)
As Boolean
Dim i As Long
Dim nbrLenStrChercheQuoi As Long
Dim nbrLenStrChercheOu As Long
Const nbrCarComp = 3

comprend = False
nbrLenStrChercheQuoi = Len(strChercheQuoi)
nbrLenStrChercheOu = Len(strChercheOu)
If nbrLenStrChercheQuoi >= nbrCarComp And nbrLenStrChercheOu > nbrCarComp Then
For i = 1 To nbrLenStrChercheQuoi - nbrCarComp + 1
If InStr(strChercheOu, Mid(strChercheQuoi, i, nbrCarComp)) > 0
Then
comprend = True
Exit Function
End If
Next
End If
End Function

et la requête suivante:

SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250] INNER JOIN [T_GOU_Titre] ON comprend([T_SBF_250].Nom,
[T_GOU_Titre].Titre)

A+

Rv


"Philippe Dhondt" a écrit dans le message de
news:KMZbf.226$
Bonjour



Comment faire un INNER JOIN ou l'on ne cherche pas une concordance
parfaite

entre les deux champs utilisés mais où une concordance partielle est
suffisante ?



Je m'explique avec un exemple :



SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo

FROM [T_SBF_250]

INNER JOIN [T_GOU_Titre] ON [T_SBF_250].Nom = [T_GOU_Titre].Titre

ORDER BY [T_GOU_Titre].Titre;



Dans cet exemple, seuls les enregistrements où le champ «
[T_SBF_250].Nom »

est rigoureusement identique au champ « [T_GOU_Titre].Titre » sont
sélectionnés. Or, ce qui m'intéresse, c'est de selectionner tous les
enregistrements pour lesquels il y a au minimum trois lettres consecutives
qui sont identiques.





Merci à toutes et tous





Philippe Dhondt






Avatar
Eric
Bonjour Rv,

Bien pour la fonction.
Mais la clause d' equi-jointure est rejetée (Access2k), non?
Par contre, pas de problème si la fonction est mise sur la restriction
du produit cartésien.


Salut,

Une piste :

Avec la fonction suivante contenu dans un module standard :

' 3 lettres consecutives de strChercheQuoi dans strChercheOu
Public Function comprend(strChercheQuoi As String, strChercheOu As String)
As Boolean
Dim i As Long
Dim nbrLenStrChercheQuoi As Long
Dim nbrLenStrChercheOu As Long
Const nbrCarComp = 3

comprend = False
nbrLenStrChercheQuoi = Len(strChercheQuoi)
nbrLenStrChercheOu = Len(strChercheOu)
If nbrLenStrChercheQuoi >= nbrCarComp And nbrLenStrChercheOu > > nbrCarComp Then
For i = 1 To nbrLenStrChercheQuoi - nbrCarComp + 1
If InStr(strChercheOu, Mid(strChercheQuoi, i, nbrCarComp)) > 0
Then
comprend = True
Exit Function
End If
Next
End If
End Function

et la requête suivante:

SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250] INNER JOIN [T_GOU_Titre] ON comprend([T_SBF_250].Nom,
[T_GOU_Titre].Titre)

A+

Rv



--
A+
Eric

Avatar
Rv
Salut,

Access 2002, en effet! Sous 97 ça ne passe pas?
Et dans tous les cas, si la condition est sur la clause where le
problème ne se pose pas mais il me semble que c'est sensiblement plus lent!

A+

Rv

"Eric" a écrit dans le message de
news:
Bonjour Rv,

Bien pour la fonction.
Mais la clause d' equi-jointure est rejetée (Access2k), non?
Par contre, pas de problème si la fonction est mise sur la restriction
du produit cartésien.


Salut,

Une piste :

Avec la fonction suivante contenu dans un module standard :

' 3 lettres consecutives de strChercheQuoi dans strChercheOu
Public Function comprend(strChercheQuoi As String, strChercheOu As
String)


As Boolean
Dim i As Long
Dim nbrLenStrChercheQuoi As Long
Dim nbrLenStrChercheOu As Long
Const nbrCarComp = 3

comprend = False
nbrLenStrChercheQuoi = Len(strChercheQuoi)
nbrLenStrChercheOu = Len(strChercheOu)
If nbrLenStrChercheQuoi >= nbrCarComp And nbrLenStrChercheOu > > > nbrCarComp Then
For i = 1 To nbrLenStrChercheQuoi - nbrCarComp + 1
If InStr(strChercheOu, Mid(strChercheQuoi, i, nbrCarComp)) >
0


Then
comprend = True
Exit Function
End If
Next
End If
End Function

et la requête suivante:

SELECT [T_SBF_250].Code, [T_SBF_250].Nom, [T_GOU_Titre].Titre,
[T_GOU_Titre].Yahoo
FROM [T_SBF_250] INNER JOIN [T_GOU_Titre] ON comprend([T_SBF_250].Nom,
[T_GOU_Titre].Titre)

A+

Rv



--
A+
Eric



Avatar
Eric
Bonsoir,

Merci pour l'info. Je ne connaissais pas le ON fonction comme
dans ton exemple :
[T_SBF_250] INNER JOIN [T_GOU_Titre] ON
comprend([T_SBF_250].Nom,[T_GOU_Titre].Titre)

Sous 2000, ça ne passe pas.
Pour ce qui est de la lenteur, je partage ton avis.

Salut,

Access 2002, en effet! Sous 97 ça ne passe pas?
Et dans tous les cas, si la condition est sur la clause where le
problème ne se pose pas mais il me semble que c'est sensiblement plus lent!

A+

Rv



--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

1 2