Problème de requête...... helppp

cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 - 20 févr. 2006 à 17:36
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 - 21 févr. 2006 à 12:07
Bonjour à tous,

J'ai un problème de requête sur lequelle je cale depuis qq heures, j'ai 3 tables :

Table Validation
Frais





frais_id | validateur_id



186 <null>



186 1


186 2





Table Frais





id | personne_id | export_comptable_bool



186 1
1





Table Personne





id | groupe_id


1 1

et en faite je voudrais récupérer 1) tous les frais
qui ont validateur_id 1 et 2) tous les frais qui ont export_comptable_bool
1

donc j'ai fais :

S"SELECT * FROM FRAIS,PERSONNE,VALIDATION_FRAIS WHERE "
S"FRAIS.PERSONNE_ID = PERSONNE.ID AND " // jointure
S"FRAIS.ID = T1.FRAIS_ID AND " // jointureS"((FRAIS.EXPORTE_COMPTABLE_BOOL 1 ) OR (VALIDATEUR_ID 1) AND "
S"PERSONNE.GROUPE_ID = 1 "

mais il me sort 3 frais parceque la jointure me donne :

Super Table







frais_id | validateur_id | personne_id |
export_comptable_bool | groupe_id


186 <null>
1
1 1


186 1 1
1 1


186 1 1
1 1
Il me fait sort 3 frais parceque dans la requête j'ai ((FRAIS.EXPORTE_COMPTABLE_BOOL <gras>1 ) OR (VALIDATEUR_ID</gras> 1)


Donc forcement tous les frais on export_comptable_bool 1, donc il me sort 3 frais. Comment faire pour avoir tous les frais qui ont validateur_id 1 et tous les frais qui ont export_comptable_bool = 1 en enlevant les doublons ? Je ne peut pas utiliser DISTINCT car mes frais comporte la propriété 'Image'.

Voila si qq avait une idée sur la question....

Par avance, merci.

6 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 36
20 févr. 2006 à 20:06
salut

SELECT max(frais_id ), validateur_id ,max( personne_id ), max(export_comptable_bool) ,max (groupe_id) FROM FRAIS,PERSONNE,VALIDATION_FRAIS WHERE "
FRAIS.PERSONNE_ID = PERSONNE.ID AND " // jointure
FRAIS.ID = T1.FRAIS_ID AND " // jointure
((FRAIS.EXPORTE_COMPTABLE_BOOL 1 ) OR (VALIDATEUR_ID 1) AND
PERSONNE.GROUPE_ID = 1
GROUP BY validateur_id

regarde le group by.
Mais je crois qu'il avale les nulls. C'est pas sur.
cs_fabrice69 Messages postés 1765 Date d'inscription jeudi 12 octobre 2000 Statut Membre Dernière intervention 11 décembre 2013 5
21 févr. 2006 à 00:14
Bonsoir,
Plutot que de vous donner la requette (bonne ou mauvaise), il est plus intéressant pour vous de savoir comment la construire vous même.
Je vous invite donc a lire l'article suivant qui vous fera mieu comprendre les jointures :
- http://sql.developpez.com/sqlaz/jointures/

PS: il est très pénalisant pour les temps de réponses s'utiliser les requête du type
.... where t1.ch1=t2.ch2
Il faut favoriser les jointures comment
.... from t1 inner join t2 on ch1=ch2

Romelard Fabrice (Alias F___)
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
21 févr. 2006 à 11:48
Tous d'abord, merci de vos réponse,

je précise qu'il y a une erreur à ce niveau : S"FRAIS.ID = VALIDATION_FRAIS .FRAIS_ID AND " // jointure

et ici :

frais_id | validateur_id | personne_id | export_comptable_bool | groupe_id

186 <null> 1 1 1

186 1 1 1 1
186 2
1 1 1


Je ne pense pas que je puisse utiliser un Groupe by car dans ma requete Select je selectionne une vingtaine de champs. Et dans un de ces champs il y a un qui est de type TEXT et je ne sais pas pourquoi on ne peut pas faire de DISTINCT quand on séléctionne un champ de type TEXT. Je pense que ma requête est à peut près bonne mais il y a des doublons, j'ai lu l'article qui parlais du sql et je pense que ce qui a l'air de le plus se rapprocher de mon problème c'est une auto-jointure du type :

S"SELECT T1.ID FROM FRAIS T1 , FRAIS T2, PERSONNE ,VALIDATION_FRAIS WHERE "
S"T1.ID = T2.ID AND " // ici pas bon, séléctionnez tous les frais ou t1.id != t2.id afin d'avoir une instance unique
S"T1.PERSONNE_ID = PERSONNE.ID AND "
S"T1.ID = VALIDATION_FRAIS.FRAIS_ID AND " S"((T1.EXPORTE_COMPTABLE_BOOL 1 ) OR (VALIDATEUR_ID1) AND "
S"PERSONNE.GROUPE_ID = 1 "

Est ce que ca vous parait jouable ?
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
21 févr. 2006 à 11:58
Pour le groupe by est ce que ca risque pas de poser des problèmes si je met MAX à tous les champs ? il va me selectionnez la valeur la plus haute ?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
21 févr. 2006 à 11:59
En faite dans mon jeux de resultat final ce qu'il faudrait c'est enlever tous les champs qui ont les mêmes FRAIS.ID
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
21 févr. 2006 à 12:07
Quoique je sais pas, parceque je selectionne aussi VALIDATEUR_ID de la table VALIDATION_FRAIS ....
Rejoignez-nous