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
          )
;