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).
Requêtes :
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é $/
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/
2/
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'
- 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
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 )
- Si il y a 2 joueurs ex aequo, je crois que ça ne prend pas le cas en compte
3/
- Si il y a 2 joueurs ex aequo, pas sur que ça ressorte les deux
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 )
Merci d'avance pour votre aide
Partager