Bonjour,

Je cherche à optimiser une requête comportant une sous-requête de la forme suivante :
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
 
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;
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.

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à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Mais dans ce code (qui ne fonctionne) pas je perd la jointure entre table3 et table3_2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
table3_2.champ1 = table3.champ1
ainsi que la condition de l'état VA
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
table4_2.champ5 = 'VA'
Quelqu'un saurait-il m'expliquer comment cette syntaxe
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 !