|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : mars 2008 Messages : 4 ![]() |
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 :
|
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
quelle version de base ?
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 4 ![]() |
9i
Mais c'est bon : j'ai pu résoudre mon problème en externalisant les jointures dans la requête appelante (celle que j'ai postée est en fait une sous-requête de cette requête appelante). |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
Avec les fonctions analytiques, un seul accès aux tables.
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Inscription : mars 2008 Messages : 4 ![]() |
J'avais essayé la solution suivante mais ça dégradait encore plus les performances.
Code :
|
||
|
|
00
|
|
|
#6 | ||||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
Avec les fonctions analytiques
(LEAD : On regarde les données de la ligne suivante si elles appartiennent au même contrat, ROW_NUMBER() : on récupère le n° de ligne par contrat ) Code :
Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||||
|
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() Inscription : mars 2008 Messages : 4 ![]() |
Merci.
Finalement, on a pris une solution toute simple : Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com