OVH Cloud OVH Cloud

SQL et HF7

7 réponses
Avatar
sebNews
Bonjour,

J'ai beaucoup de mal avec la syntaxe SQL et HF7 avec les jointures

J'ai une Table CLIENTS et CAT ( code libelle ) Un clients peut avoir
une catégorie ( bon , pas bon etc )

Liste des clients avec la catégorie : Pas de problèmes:

SELECT clients.code_cli, clients.Nom, clients.adresse1, clients.adresse2,
clients.date_fin_rth, cat.libelle
FROM clients LEFT JOIN cat ON cat.code=clients.cat

Par contre j'ai une seconde table liée à Client : CAT2( code, libelle ) du
même type

Et la je coince , impossible de faire ma reqêtte ( avec double jointure)
( je sais faire avec des clauses Where et And mais )


SELECT clients.code_cli, clients.Nom, clients.adresse1, clients.adresse2,
clients.date_fin_rth, cat.libelle, cat2.libelle
FROM clients LEFT JOIN cat2 ON cat2.code=clients.cat2
LEFT JOIN cat ON cat.code=clients.cat

Cette syntaxe ne fonctionne pas, j'ai essayé de plusieurs eplacement de
parenthèses mais
je n'y arive pas.

Qui peut me donner un coup de main pour ma syntaxe de jointures ?

******
Sinon avec clause Where cela fonctionne

SELECT Clients.Nom AS Nom,
Clients.prenom AS prenom,
cat.libelle AS libelle1,
cat2.libelle AS libelle2,
Clients.ville AS ville
FROM cat, cat2, Clients
WHERE Clients.cat = cat.code
AND Clients.cat2= cat2.code

7 réponses

Avatar
mat
sebNews wrote:
SELECT clients.code_cli, clients.Nom, clients.adresse1,
clients.adresse2, clients.date_fin_rth, cat.libelle, cat2.libelle
FROM clients LEFT JOIN cat2 ON cat2.code=clients.cat2 LEFT JOIN
cat ON cat.code=clients.cat

Cette syntaxe ne fonctionne pas, j'ai essayé de plusieurs eplacement
de parenthèses mais je n'y arive pas.

Qui peut me donner un coup de main pour ma syntaxe de jointures ?

****** Sinon avec clause Where cela fonctionne

SELECT Clients.Nom AS Nom, Clients.prenom AS prenom, cat.libelle AS
libelle1, cat2.libelle AS libelle2, Clients.ville AS ville FROM cat,
cat2, Clients WHERE Clients.cat = cat.code AND Clients.cat2 > cat2.code




Il y a plusieurs possibilités (voir l'aide pour la syntaxe).

SELECT clients.code_cli, clients.Nom, clients.adresse1, clients.adresse2,
clients.date_fin_rth, cat.libelle, cat2.libelle
FROM clients LEFT JOIN cat2 ON cat2.code=clients.cat2,
clients LEFT JOIN cat ON cat.code=clients.cat

ou bien

SELECT clients.code_cli, clients.Nom, clients.adresse1, clients.adresse2,
clients.date_fin_rth, cat.libelle, cat2.libelle
FROM clients LEFT JOIN cat2 ON cat2.code=clients.cat2,
cat RIGHT JOIN clients ON cat.code=clients.cat


devraient marcher.
Avatar
mat
mat wrote:
Il y a plusieurs possibilités (voir l'aide pour la syntaxe).

SELECT clients.code_cli, clients.Nom, clients.adresse1,
clients.adresse2, clients.date_fin_rth, cat.libelle, cat2.libelle
FROM clients LEFT JOIN cat2 ON cat2.code=clients.cat2, clients LEFT
JOIN cat ON cat.code=clients.cat

ou bien

SELECT clients.code_cli, clients.Nom, clients.adresse1,
clients.adresse2, clients.date_fin_rth, cat.libelle, cat2.libelle
FROM clients LEFT JOIN cat2 ON cat2.code=clients.cat2, cat RIGHT
JOIN clients ON cat.code=clients.cat




ouuuf... faut plutôt oublier ce conseil :-)

Je n'ai pas fait assez attention:
LEFT et RIGHT ne sont utilisés que dans des OUTER JOINS.
Pour un left join utiliser INNER JOIN.

Conclusion:

SELECT clients.code_cli, clients.Nom, clients.adresse1,
clients.adresse2, clients.date_fin_rth, cat.libelle, cat2.libelle
FROM clients INNER JOIN cat2 ON cat2.code=clients.cat2,
clients INNER JOIN cat ON cat.code=clients.cat
Avatar
sebNews
Ok merci de la réponse je vais essayer cette syntaxe
C'est du SQL2 standard ?

Sébastien




"mat" a écrit dans le message de
news:41dc2618$
mat wrote:
> Il y a plusieurs possibilités (voir l'aide pour la syntaxe).
>
> SELECT clients.code_cli, clients.Nom, clients.adresse1,
> clients.adresse2, clients.date_fin_rth, cat.libelle, cat2.libelle
> FROM clients LEFT JOIN cat2 ON cat2.code=clients.cat2, clients LEFT
> JOIN cat ON cat.code=clients.cat
>
> ou bien
>
> SELECT clients.code_cli, clients.Nom, clients.adresse1,
> clients.adresse2, clients.date_fin_rth, cat.libelle, cat2.libelle
> FROM clients LEFT JOIN cat2 ON cat2.code=clients.cat2, cat RIGHT
> JOIN clients ON cat.code=clients.cat


ouuuf... faut plutôt oublier ce conseil :-)

Je n'ai pas fait assez attention:
LEFT et RIGHT ne sont utilisés que dans des OUTER JOINS.
Pour un left join utiliser INNER JOIN.

Conclusion:

SELECT clients.code_cli, clients.Nom, clients.adresse1,
clients.adresse2, clients.date_fin_rth, cat.libelle, cat2.libelle
FROM clients INNER JOIN cat2 ON cat2.code=clients.cat2,
clients INNER JOIN cat ON cat.code=clients.cat



Avatar
mat
sebNews wrote:
Ok merci de la réponse je vais essayer cette syntaxe C'est du SQL2
standard ?



Je regrette, je ne suis pas un expert en la matière. J'ai vu quelque
part que WD correspond à SQL92 mais j'ai l'impression que tous les
éditeurs ont leur propres interpretations. J'utilise prèsque toujours
cette syntaxe puisqu'elle est plus rapide que des liaisons par WHERE
dans mes requêtes multi-fichiers.
Avatar
sebNews
Ok merci
j'ai fait un essai et cela fonctionne
par contre cela ne me sort pas les clients
qui n'ont pas de correspondance dans les tables
catégorie1 ou catégorie2

J'ai résolu le problème en mettant un code 0 dans les
tables CAT1 et CAT2 et des valeurs par défaut à 0
dans le fichiers clients.

Mais peut t on en SQL sortir :
" La liste des clients avec leur catégorie y compris ceux dont la catégorie
n'est pas saisie " ?


Sébastien




"mat" a écrit dans le message de
news:41dd1278$
sebNews wrote:
> Ok merci de la réponse je vais essayer cette syntaxe C'est du SQL2
> standard ?

Je regrette, je ne suis pas un expert en la matière. J'ai vu quelque
part que WD correspond à SQL92 mais j'ai l'impression que tous les
éditeurs ont leur propres interpretations. J'utilise prèsque toujours
cette syntaxe puisqu'elle est plus rapide que des liaisons par WHERE
dans mes requêtes multi-fichiers.


Avatar
roumegou
sebNews avait soumis l'idée :
Ok merci
j'ai fait un essai et cela fonctionne
par contre cela ne me sort pas les clients
qui n'ont pas de correspondance dans les tables
catégorie1 ou catégorie2

J'ai résolu le problème en mettant un code 0 dans les
tables CAT1 et CAT2 et des valeurs par défaut à 0
dans le fichiers clients.

Mais peut t on en SQL sortir :
" La liste des clients avec leur catégorie y compris ceux dont la catégorie
n'est pas saisie " ?



c'est le left outer join (à la diff du inner join)

si tu veux tous les clients meme ceux qui n'ont pas de catégorie
select client.nom, client.cat_id,categorie.libelle from client left
outer join catgorie on client.cat_idÊtegorie.cat_id
si tu ne veux que les clients qui ont une catégorie
select client.nom, client.cat_id,categorie.libelle from client inner
join catgorie on client.cat_idÊtegorie.cat_id
si tu veux que les clients qui n'ont pas de catégorie
select client.nom, client.cat_id,categorie.libelle from client inner
join catgorie on client.cat_idÊtegorie.cat_id
and categorie.libelle is null

A adapter pour du HF


Sébastien




"mat" a écrit dans le message de
news:41dd1278$
sebNews wrote:
Ok merci de la réponse je vais essayer cette syntaxe C'est du SQL2
standard ?



Je regrette, je ne suis pas un expert en la matière. J'ai vu quelque
part que WD correspond à SQL92 mais j'ai l'impression que tous les
éditeurs ont leur propres interpretations. J'utilise prèsque toujours
cette syntaxe puisqu'elle est plus rapide que des liaisons par WHERE
dans mes requêtes multi-fichiers.





--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
sebNews
Salut,
merci Eric,
je pense que c'est l'adaptation sur HF7 qui me posait
pb : C'est la combinaison de plusieurs jointures
Par contre il ne faut pas oublier aussi de faire
categorie.libelle AS Exp1
categorie2.libelle AS Exp2

J'ai pu me débrouiller

Merci à vous deux pour votre aide

Sébastien







"roumegou" a écrit dans le message de
news:
sebNews avait soumis l'idée :
> Ok merci
> j'ai fait un essai et cela fonctionne
> par contre cela ne me sort pas les clients
> qui n'ont pas de correspondance dans les tables
> catégorie1 ou catégorie2
>
> J'ai résolu le problème en mettant un code 0 dans les
> tables CAT1 et CAT2 et des valeurs par défaut à 0
> dans le fichiers clients.
>
> Mais peut t on en SQL sortir :
> " La liste des clients avec leur catégorie y compris ceux dont la


catégorie
> n'est pas saisie " ?

c'est le left outer join (à la diff du inner join)

si tu veux tous les clients meme ceux qui n'ont pas de catégorie
select client.nom, client.cat_id,categorie.libelle from client left
outer join catgorie on client.cat_idÊtegorie.cat_id
si tu ne veux que les clients qui ont une catégorie
select client.nom, client.cat_id,categorie.libelle from client inner
join catgorie on client.cat_idÊtegorie.cat_id
si tu veux que les clients qui n'ont pas de catégorie
select client.nom, client.cat_id,categorie.libelle from client inner
join catgorie on client.cat_idÊtegorie.cat_id
and categorie.libelle is null

A adapter pour du HF
>
>
> Sébastien
>
>
>
>
> "mat" a écrit dans le message de
> news:41dd1278$
>> sebNews wrote:
>>> Ok merci de la réponse je vais essayer cette syntaxe C'est du SQL2
>>> standard ?
>>
>> Je regrette, je ne suis pas un expert en la matière. J'ai vu quelque
>> part que WD correspond à SQL92 mais j'ai l'impression que tous les
>> éditeurs ont leur propres interpretations. J'utilise prèsque toujours
>> cette syntaxe puisqu'elle est plus rapide que des liaisons par WHERE
>> dans mes requêtes multi-fichiers.

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net