Bonjour,
Je cherche à optimiser une requête comportant une sous-requête de la forme suivante :
Dans l'idée je voudrais trouver un moyen de réécrire cette requête en supprimant la double lecture de table due à l'utilisation de la sous-requête de select max.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 SELECT table1.champ1, table1.champ2, table1.champ3, table1.champ4, table1.champ5, table1.champ6, table1.champ7, table3.champ1 FROM table1, table2, table3, table4 WHERE table1.champ1='TOTO' AND table1.date1 >= TO_DATE('JJMMAAAA','DD/MM/YYYY') AND table1.champ2 = table4.champ2 AND table4.champ9 = 1 AND table3.champ1 = table1.champ1 AND table3.champ3 = table3.champ3 AND table1.champ10 = '2013' AND table3.champmax = ( SELECT MAX(table3_2.champcible) FROM table3_2, table4_2 WHERE table3_2.champ1 = table3.champ1 AND table3_2.champ2 = table4_2.champ2 AND table3_2.champ3 = table4_2.champ9 AND table4_2.champ5 = 'VA' ) ORDER BY table1.champ8;
J'ai chercher des informations sur le net pour modifier ce type de requête. Et je suis tombé sur des syntaxes du type :
SELECT MAX() over (partition by ) As mon_max
J'ai essayé de modifier ma requête en utilisant ce principe mais je ne comprend pas bien comment cela fonctionne et en conséquence ne parviens pas à réécrire ma requête qui est actuellement de ce style là :
Mais dans ce code (qui ne fonctionne) pas je perd la jointure entre table3 et table3_2Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 SELECT table1.champ1, table1.champ2, table1.champ3, table1.champ4, table1.champ5, table1.champ6, table1.champ7, table3.champ1, MAX(table3_2.champcible) over (partition by table3_2.champ2, table3_2.champ3) As mon_max FROM table1, table2, table3, table4 WHERE table1.champ1='TOTO' AND table1.date1 >= TO_DATE('JJMMAAAA','DD/MM/YYYY') AND table1.champ2 = table4.champ2 AND table4.champ9 = 1 AND table3.champ1 = table1.champ1 AND table3.champ3 = table3.champ3 AND table1.champ10 = '2013' AND table3.champmax = mon_max ORDER BY table1.champ8;
ainsi que la condition de l'état VACode:
1
2 table3_2.champ1 = table3.champ1
Quelqu'un saurait-il m'expliquer comment cette syntaxeCode:
1
2table4_2.champ5 = 'VA'
SELECT MAX() over (partition by ) As mon_max
peut être appliquée a une requête de la même forme que la mienne qui impacte plusieurs table et ayant plusieurs condition dans la sous-requête ?
Ou tout simplement me dire que ce n'est pas possible. Ca ne me dérange pas que ce ne soit pas faisable de cette façon. Mais si ça l'est, ça m'intéresse vraiment de comprendre le fonctionnement et de pouvoir l'utiliser sur d'autre requête de la même forme.
Vous l'aurez bien compris je ne demande pas nécessairement une solution aboutie, mais je cherche surtout à comprendre et apprendre via ce post.
Merci d'avance pour vos réponses ;)!