Bonjour.
J'ai une table CONTRATS qui a les champs ID_CONTRAT, ID_GARANTIE et TAUX (de la garantie). Cette table contient une ligne par contrat.
J'ai aussi une table CONTRAT_GARANTIE qui a les champs ID_CONTRAT, ID_GARANTIE et MONTANT. Cette table peut contenir une ou deux garanties (donc une ou deux lignes) pour chaque contrat.
Je dois créer une requête qui, pour chaque contrat, me sort sur une même ligne l'Id du contrat et les infos de la ou des garanties de ce contrat.
Autrement dit, on doit se retrouver avec une ligne qui comporte les champs suivants : ID_CONTRAT, ID_GARANTIE_1, MONTANT_GARANTIE_1, TAUX_GARANTIE_1, ID_GARANTIE_2, MONTANT_GARANTIE_2, TAUX_GARANTIE_2.
Sachant que
- quand une garantie est présente dans CONTRAT_GARANTIE mais pas dans CONTRATS, son champ TAUXGARANTIE est affecté à zéro
- quand un contrat n'a qu'une seule garantie dans CONTRAT_GARANTIE, les champs de la deuxième garantie sont affectés à NULL
EXEMPLE :
Table CONTRATS :
Contrat1 --- Garantie1 --- Taux1
Contrat2 --- Garantie2 --- Taux2
Table CONTRAT_GARANTIE :
Contrat1 --- Garantie1 --- Montant1
Contrat2 --- Garantie2 --- Montant2
Contrat2 --- Garantie3 --- Montant3
Requête :
Contrat1 --- Garantie1 --- Montant1 --- Taux1 --- NULL --- NULL --- NULL
Contrat2 --- Garantie2 --- Montant2 --- Taux2 --- Garantie3 --- Montant3 --- 0
J'ai réussi à le faire grâce au code suivant mais il est beaucoup trop gourmand en ressources et en temps donc j'aimerais savoir s'il existe un moyen de faire la même chose mais beaucoup plus rapidement.
N.B. Le "ELSE NULL" est sous-entendu dans les CASE.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 SELECT CNT_GAR.IDCONTRAT IDCONTRAT, GAR1 IDGARANTIE1, CONTRAT1.TAUX TAUX_1, GARANTIE1.MONTANT MONTANT_1, CASE WHEN GAR1 <> GAR2 THEN GAR2 END IDGARANTIE_2, CASE WHEN GAR1 <> GAR2 THEN 0 END TAUX_2, GARANTIE2.MONTANT MONTANT_2, FROM ( SELECT IDCONTRAT, MIN(IDGARANTIE) GAR1, MAX(IDGARANTIE) GAR2 FROM CONTRAT_GARANTIE GROUP BY IDCONTRAT ) CNT_GAR LEFT JOIN CONTRATS CONTRAT1 ON ( CONTRAT1.IDCONTRAT = CNT_GAR.IDCONTRAT AND CONTRAT1.IDGARANTIE = CNT_GAR.GAR1 ) LEFT JOIN CONTRAT_GARANTIE GARANTIE1 ON ( GARANTIE1.IDCONTRAT = CNT_GAR.IDCONTRAT AND GARANTIE1.IDGARANTIE = CNT_GAR.GAR1 ) LEFT JOIN CONTRAT_GARANTIE GARANTIE2 ON ( GARANTIE2.IDCONTRAT = CNT_GAR.IDCONTRAT AND GARANTIE2.IDGARANTIE = CNT_GAR.GAR2 ) ;
Partager