Hello à tous,

J'ai besoin de votre avis pour de l'optimisation de requêtes. J'ai déjà jeté un coup d'oeil à http://sqlpro.developpez.com/cours/optimiser/ mais je ne trouve pas mon bonheur.

Je vous donne tout de même le contexte même si je pense qu'en lisant simplement les requêtes il est facile de comprendre la chose : : une base de joueurs de basket (table JOUEUR), avec une liste d'équipe (table EQUIPE), des matchs d'une équipe contre une autre (table MATCH), et une table avec les tirs tenté/réussi de chaque joueur pendant les matchs (table TIR_PENDANT_MATCH).

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
Table JOUEUR:
JOUEUR_ID
NOM_JOUEUR

Table EQUIPE:
EQUIPE_ID

Table MATCH:
MATCH_ID
EQUIPE_ID_1
EQUIPE_ID_2

Table TIR_PENDANT_MATCH:
TIR_ID
JOUEUR_ID
EQUIPE_ID
MATCH_ID
NOMBRE_POINT_SHOOT_TENTE /* = 1 si lancer franc, =2 si shoot à 2 points, =3 si shoot à 3 points */
TIR_REUSSI_FLAG /* = 1 si shoot réussi, = 0 si shoot raté $/
Requêtes :
1/ Qui sont les joueurs n'ayant jamais marqué ?
2/ Quel joueurs a le plus marqué dans la saison ?
3/ Quel joueur a marqué le plus par match (donc ratio du total des points marqués par nombre de match joué) ?

J'ai mes requêtes de mon côté, mais je pense qu'il y a 10 000 moyens de faire chacune (au niveau des jointures, des sous-req, etc...) et j'aurai aimé avoir votre avis sur ce qui est le plus optimisé :

1/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SELECT NOM_JOUEUR
FROM JOUEUR a
INNER JOIN TIR_PENDANT_MATCH b
ON a.JOUEUR_ID = b.JOUEUR_ID
HAVING sum(CASE WHEN TIR_REUSSI_FLAG = '0' THEN '0' ELSE '1' END) = '0'
2/
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
SELECT a.JOUEUR_ID, NOM_JOUEUR, POINTS_MARQUE
FROM JOUEUR a
INNER JOIN 
	(SELECT JOUEUR_ID, SUM(NOMBRE_POINT_SHOOT_TENTE) AS POINTS_MARQUE
	FROM TIR_PENDANT_MATCH
	WHERE TIR_REUSSI_FLAG = '1'
	GROUP BY JOUEUR_ID) b
ON a.JOUEUR_ID = b. JOUEUR_ID
WHERE b.POINTS_MARQUE = (SELECT MAX(sub.POINTS_MARQUE) 
						FROM
							(SELECT JOUEUR_ID, SUM(NOMBRE_POINT_SHOOT_TENTE) AS POINTS_MARQUE
							FROM TIR_PENDANT_MATCH
							WHERE TIR_REUSSI_FLAG = '1'
							GROUP BY JOUEUR_ID) sub
						)
- Il doit y avoir moyen de faire quelque chose avec un RANK() OVER (PARTITION BY JOUEUR_ID ORDER BY SUM(NOMBRE_POINT_SHOOT_TENTE)) AS Partition_point
- Si il y a 2 joueurs ex aequo, je crois que ça ne prend pas le cas en compte

3/
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
SELECT a.JOUEUR_ID,NOM_JOUEUR, MOYENNE_POINT
FROM JOUEUR a
INNER JOIN 
	(SELECT JOUEUR_ID 
	, SUM(NOMBRE_POINT_SHOOT_TENTE*TIR_REUSSI_FLAG)/count(DISTINCT MATCH_ID) AS MOYENNE_POINT
	FROM TIR_PENDANT_MATCH
	GROUP BY JOUEUR_ID) b
ON a.JOUEUR_ID = b.JOUEUR_ID
WHERE MOYENNE_POINT = (SELECT MAX(MOYENNE_POINT)
					   FROM 
							(SELECT JOUEUR_ID 
							,SUM(NOMBRE_POINT_SHOOT_TENTE*TIR_REUSSI_FLAG)/count(DISTINCT MATCH_ID) AS MOYENNE_POINT
							FROM TIR_PENDANT_MATCH
							GROUP BY JOUEUR_ID) b
						)
- Si il y a 2 joueurs ex aequo, pas sur que ça ressorte les deux

Merci d'avance pour votre aide