OVH Cloud OVH Cloud

Accees 2000 pb de choix de type

1 réponse
Avatar
Olivier Sarda
Bonjour,
je travaille avec C++Builder6 et Access 2000

Je recherche avoir plusieurs type d'ebalissement ex 'CP' ou 'AS' etc..

quand je fais :

Code:
SELECT DISTINCT T.LibelleType AS NatureEtablissement, C.Commune,
E.NomEt, E.Adresse, E.CompAdresse, E.Tel, E.Mail, E.Fax, E.SiteWeb
FROM Etablissement AS E, Commune AS C, Type AS T
WHERE E.CodeType=T.CodeType AND E.CodeCommune=C.CodeCommune and
t.type='as'
ORDER BY E.NomEt;


c'est OK

mais dans la condition WHERE qand je fais par exemple:

Code:
E.CodeCommune=C.CodeCommune and t.type='as' AND t.type='Cp'


La plus d'enregistrement alors qu'ils sont bien present.

Je voudrais que ma requete puisse lire au miniminum 1 seul type ou
2 ,3 ou n type est il possible de faire en un seule requete ?

faut il faire un GroupBy ? HAVING BY si oui comment ?

merci de vos response....

si je n'est pas ete assez clair contactez moi

_________________
Cordialement,
Sarda Olivier
_________________________________
Site Web :
http://www.membres.lycos.fr/osarda/

1 réponse

Avatar
Ph. B.
Olivier Sarda wrote:

Bonjour,
je travaille avec C++Builder6 et Access 2000

Je recherche avoir plusieurs type d'ebalissement ex 'CP' ou 'AS' etc..

quand je fais :

Code:
SELECT DISTINCT T.LibelleType AS NatureEtablissement, C.Commune,
E.NomEt, E.Adresse, E.CompAdresse, E.Tel, E.Mail, E.Fax, E.SiteWeb
FROM Etablissement AS E, Commune AS C, Type AS T
WHERE E.CodeType=T.CodeType AND E.CodeCommune=C.CodeCommune and
t.type='as'
ORDER BY E.NomEt;


c'est OK

mais dans la condition WHERE qand je fais par exemple:

Code:
E.CodeCommune=C.CodeCommune and t.type='as' AND t.type='Cp'


La plus d'enregistrement alors qu'ils sont bien present.



Ce qui est tout à fait normal tu demandes qu'une colonne ait *à la fois* les
valeurs 'as' et 'Cp' !

Il te faut donc changer cette partie de la clause "where" et écrire:

E.CodeCommune = C.CodeCommune AND
( T.CodeType = 'as' OR T.CodeType = 'Cp' )

Tu peux aussi écrire (et dans ce cas, tu peux étendre ta sélection à n types):

E.CodeCommune = C.CodeCommune AND T.CodeType IN ( 'as', 'Cp' )


Allons plus loin ! Ta clause where comprend des conditions de jointures et des
conditions de filtres car tu utilise une requête avec un produit cartésien alors
qu'une jointure interne serait plus logique et efficace (bien qu'avec Access...).
Pour une meilleure lisibilité et efficacité, sépares les deux et écris:

SELECT T.LibelleType AS NatureEtablissement, C.Commune,
E.NomEt, E.Adresse, E.CompAdresse, E.Tel, E.Mail, E.Fax, E.SiteWeb
FROM Etablissement E
INNER JOIN Commune C ON E.CodeType = T.CodeType
INNER JOIN Type T ON E.CodeCommune=C.CodeCommune
WHERE T.CodeType IN ( 'as', 'Cp' )
ORDER BY E.NomEt

Attention avec Access, tu seras peut être obligé de parenthéser tes jointures
comme suit (bien que ce ne soit pas la norme !)

SELECT T.LibelleType AS NatureEtablissement, C.Commune,
E.NomEt, E.Adresse, E.CompAdresse, E.Tel, E.Mail, E.Fax, E.SiteWeb
FROM ( Etablissement E
INNER JOIN Commune C ON E.CodeType = T.CodeType )
INNER JOIN Type T ON E.CodeCommune=C.CodeCommune
WHERE T.CodeType IN ( 'as', 'Cp' )
ORDER BY E.NomEt

Je voudrais que ma requete puisse lire au miniminum 1 seul type ou
2 ,3 ou n type est il possible de faire en un seule requete ?



Cf. ci-dessus voir le mot clé "IN"

faut il faire un GroupBy ? HAVING BY si oui comment ?



Non, il s'agit ici d'une condition de filtre, à placer dans la clause "WHERE" !

Le "HAVING" sert dans des requêtes avec des aggrégations (clause "GROUP BY")
SELECT ...
FROM ...
GROUP BY ...
HAVING ...

Ce qui n'est pas le cas ici. D'autre part, c'est plus couteux en performance de
filtrer dans un having que dans le where et ca ne repond pas à la même
problématique...

merci de vos response....



De rien...
Pour les jointures, c'est expliqué ici :
http://sqlpro.developpez.com/SQL_AZ_3.html

et les clauses GROUP BY et HAVING :
http://sqlpro.developpez.com/SQL_AZ_4.html

si je n'est pas ete assez clair contactez moi

_________________
Cordialement,
Sarda Olivier
_________________________________
Site Web :
http://www.membres.lycos.fr/osarda/



--
Philippe.