Jointures externe? comment?

Jointures externe? comment? - SQL/NoSQL - Programmation

Marsh Posté le 20-03-2008 à 11:04:18    

Bonjour.
 
 
Mon application possède toute une liste de prospects.
Chaque prospect peux souscrire à plusieurs produits différents.
Il peux par exemple avoir souscrit à 3 assurance santé (ses enfants), 2 assurances auto moto.
 
Les tables secondaires sont en fait les tables concernant les produits souscrits, elles sont donc toutes différentes dans leur structure.
 
Et moi ce que j'aimerai faire avec ma requête c'est pouvoir récupérer tout les produits de chaque prospect en fait.
 
La structure de ma BDD est celle ci (dans chaque table de produit il y a bien entendu une référence à l'ID du prospect).
 
    * assanim (table d'un produit)
    *  automoto (table d'un produit)
    *  budgetor (table contenant les infos prospects)
    *  depend (table d'un produit)
    *  dotation (table d'un produit)
    *  finance (table d'un produit)
    *  grev (table d'un produit)
    *  habitprinc (table d'un produit)
    *  habitsc (table d'un produit)
    *  immeub (table d'un produit)
    *  lowimp (table d'un produit)
    *  mapad (table d'un produit)
    *  obseque (table d'un produit)
    *  pjfisc (table d'un produit)
    *  pnoccup (table d'un produit)
    *  prevdc (table d'un produit)
    *  rccansf (table d'un produit)
    * retraite (table d'un produit)
    *  sante (table d'un produit)
 
Merci à vous.

Reply

Marsh Posté le 20-03-2008 à 11:04:18   

Reply

Marsh Posté le 20-03-2008 à 11:08:52    

Et tu as essayé quoi?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-03-2008 à 11:15:11    

J'ai essayé cela

Code :
  1. SELECT *
  2. FROM budgetor
  3. LEFT OUTER JOIN assanim ON budgetor.ID_BUDGETOR = assanim.ID_BUDGETOR
  4. LEFT OUTER JOIN automoto ON budgetor.ID_BUDGETOR = automoto.ID_BUDGETOR
  5. LEFT OUTER JOIN depend ON budgetor.ID_BUDGETOR = depend.ID_BUDGETOR
  6. LEFT OUTER JOIN dotation ON budgetor.ID_BUDGETOR = dotation.ID_BUDGETOR
  7. LEFT OUTER JOIN finance ON budgetor.ID_BUDGETOR = finance.ID_BUDGETOR
  8. LEFT OUTER JOIN grev ON budgetor.ID_BUDGETOR = grev.ID_BUDGETOR
  9. LEFT OUTER JOIN habitprinc ON budgetor.ID_BUDGETOR = habitprinc.ID_BUDGETOR
  10. LEFT OUTER JOIN habitsc ON budgetor.ID_BUDGETOR = habitsc.ID_BUDGETOR
  11. LEFT OUTER JOIN immeub ON budgetor.ID_BUDGETOR = immeub.ID_BUDGETOR
  12. LEFT OUTER JOIN lowimp ON budgetor.ID_BUDGETOR = lowimp.ID_BUDGETOR
  13. LEFT OUTER JOIN mapad ON budgetor.ID_BUDGETOR = mapad.ID_BUDGETOR
  14. LEFT OUTER JOIN obseque ON budgetor.ID_BUDGETOR = obseque.ID_BUDGETOR
  15. LEFT OUTER JOIN pjfisc ON budgetor.ID_BUDGETOR = pjfisc.ID_BUDGETOR
  16. LEFT OUTER JOIN pnoccup ON budgetor.ID_BUDGETOR = pnoccup.ID_BUDGETOR
  17. LEFT OUTER JOIN prevdc ON budgetor.ID_BUDGETOR = prevdc.ID_BUDGETOR
  18. LEFT OUTER JOIN rccansf ON budgetor.ID_BUDGETOR = rccansf.ID_BUDGETOR
  19. LEFT OUTER JOIN retraite ON budgetor.ID_BUDGETOR = retraite.ID_BUDGETOR
  20. LEFT OUTER JOIN sante ON budgetor.ID_BUDGETOR = sante.ID_BUDGETOR


 
Mais à priori il y a de gros problèmes dans les résultats retournés.

Reply

Marsh Posté le 20-03-2008 à 12:13:53    

Renverse tes clauses car tu es en LEFT JOIN :

Code :
  1. 1. SELECT *
  2.    2. FROM budgetor
  3.    3. LEFT OUTER JOIN assanim ON assanim.ID_BUDGETOR = budgetor.ID_BUDGETOR
  4.    ...

Reply

Marsh Posté le 20-03-2008 à 12:31:43    

pecky -> je viens de tester et bizarrement ca me renvoi la même chose.
 
Avec des résultats bizarre.

Code :
  1. [IDDOTATION] => [IDFINANCE] => [MONTANTS1] => [SUPPORT1] => [MONTANTS2] => [SUPPORT2] => [MONTANTS3] => [SUPPORT3] => [MONTANTS4] => [SUPPORT4] => [MONTANTS5] => [SUPPORT5] =>


 
Comme vous pouvez le voir pour la table DOTATION aucun champs n'est retourné alors que pour finance oui, c'est pour ca je me demandais si ma requête était bonne ou pas.

Reply

Marsh Posté le 20-03-2008 à 16:20:21    

Perso j'ai du mal à comprendre ton résultat mais lorsque tu fais un left outer join, tu ramènes les données de la table en jointure si la condition de jointure est vérifiée.
Es-tu sur que tu as des éléments dans ta table dotation qui soient en relation avec ta table budgetor?
Essaye la requete simple :

Code :
  1. SELECT dotation.*
  2. FROM budgetor
  3. LEFT OUTER JOIN dotation ON dotation .ID_BUDGETOR = budgetor.ID_BUDGETOR


Reply

Marsh Posté le 20-03-2008 à 18:42:39    

pecky -> Dans ma requête de test a aucun moment il y a une dotation .ID_BUDGETOR = budgetor.ID_BUDGETOR et rien n'est renvoyé, mais pour d'autres ou c'est la mêmes chose les champs sont renvoyés!!!!
 
Sinon ta requête me retourne 13 enregistrements avec tout les champs à NULL ce qui est normal car il n'y a aucune souscription à dotation pour le moment.
 
Cela est pareil pour  sante, aucune souscription et pourtant dans ma première requête très longue les champs sont retournés.
 
C'est cela que je ne comprends pas!!!!!!!
Avec ta requête de test si je met santé ca retourne 6 résultats avec que des champs à NULL!!
 
Alors pourquoi dans ma longue requete les champs de sante sont retournés et non ceux de dotation!!!!
 
Si je fait un test avec une dotation de souscrite, on voit que seul l'ID est retourné alors que pour finance tout les champs sont retournés tout en étant NULL!!!!
 
[IDDOTATION] => 16/03/2008 12:57-2 [IDFINANCE] => [MONTANTS1] => [SUPPORT1] => [MONTANTS2] => [SUPPORT2] => [MONTANTS3] => [SUPPORT3] => [MONTANTS4] => [SUPPORT4] => [MONTANTS5] => [SUPPORT5] => [IDGREV] =>
 
Mystère.


Message édité par masseur le 20-03-2008 à 18:47:55
Reply

Marsh Posté le 20-03-2008 à 23:09:48    

ton modèle me semble absolument foireux dans la mesure ou si comme dans ton exemple, t'as souscrit à 3 assurances santés et 2 assurance moto, pour un unique budgetor_id, tu va avoir 6 lignes, avec toutes les combinaisons possible de assurance santé / assurance moto parmis les assurances souscrites.
 
sans oublier que devoir faire autant de jointures (externes qui plus est) pour ne retourner que si peu d'information, y'a une couille dans le potage.
 
tu ferais mieu de dénormaliser ton modèle pour n'avoir qu'une seule table produit selon moi.
 
Note subsidiaire : va faire un tour ici histoire de comprendre comment avec une "unique table" tu peux gérer tous tes types de contrats (et même créer de nouveaux types de contrats ou modifier leur structure dans le temps, sans avoir besoin de modifier le code source de ton programme ou le modèle de données)
http://forum.hardware.fr/hfr/Progr [...] m#t1668734


Message édité par MagicBuzz le 20-03-2008 à 23:26:14
Reply

Marsh Posté le 21-03-2008 à 14:13:12    

Merci MagicBuzz je vais aller voir ca.
 


Message édité par masseur le 21-03-2008 à 14:33:49
Reply

Marsh Posté le 21-03-2008 à 14:33:54    

Il faudrait donc créer une classe mère produit  et ensuite des tables filles avec en plus les champs qui les différencient?
Cela sous entend que la table produit devra contenir tout les champs communs de nos produits?

Reply

Marsh Posté le 21-03-2008 à 14:33:54   

Reply

Marsh Posté le 21-03-2008 à 17:28:35    

Ca, c'est effectivement la première étape, telle qu'elle est imposée par la méthode MERISE si on la suit à 100% : aucune redondance.
 
La méthode évoquée dans mon lien permet d'éviter de gérer 36 tables filles, en se basant sur une structure permettant de gérer les différentes informations de chacune des tables filles. Ceci implique en revanche un certain nombre de contraintes supplémentaires, mais cela permet d'ajouter à la volée de "nouvelles tables filles" sans devoir toucher au code ni à la base de données.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed