Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2010, 14h27   #1
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Par défaut Optimisation : sous-requête dans WHERE ou GROUP BY ?

J'ai deux requêtes possibles pour répondre au besoin suivant :
Lister les stages dans lesquels il reste des places, correspondant à la discipline du concours passé par un étudiant.

La première requête compare le nombre d'inscrits à chaque stage à la capacité du stage en utilisant une sous-requête dans le WHERE.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT ssn.ssn_id, ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin, 
    cmn.cmn_nom, dpt.dpt_numero, rgn.rgn_nom 
FROM te_session_ssn ssn 
INNER JOIN th_stage_stg stg ON stg.stg_id_session = ssn.ssn_id 
    INNER JOIN te_etablissement_etb etb ON etb.etb_id = stg.stg_id_etablissement 
        INNER JOIN tr_commune_cmn cmn ON cmn.cmn_id = etb.etb_id_commune 
            INNER JOIN tr_departement_dpt dpt ON dpt.dpt_id = cmn.cmn_id_departement 
                INNER JOIN tr_region_rgn rgn ON rgn.rgn_id = dpt.dpt_id_region 
    INNER JOIN tj_stg_concerner_dsc_scd scd ON scd.scd_id_stage = stg.stg_id_session 
        INNER JOIN te_discipline_dsc dsc ON dsc.dsc_id = scd.scd_id_discipline 
            INNER JOIN te_concours_ccr ccr ON ccr.ccr_id_discipline = dsc.dsc_id 
                INNER JOIN th_etudiant_etu etu ON etu.etu_id_concours = ccr.ccr_id 
WHERE etu.etu_id_candidat = :idEtudiant 
    AND 
    (
        SELECT COUNT(*)
        FROM tj_cnd_inscrire_ssn_cis cis
        WHERE cis.cis_id_session = ssn.ssn_id
    ) < ssn.ssn_capacite
La seconde fait un GROUP BY et une restriction HAVING.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT ssn.ssn_id, ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin, ssn_capacite, 
    cmn.cmn_nom, dpt.dpt_numero, rgn.rgn_nom 
FROM te_session_ssn ssn 
INNER JOIN th_stage_stg stg ON stg.stg_id_session = ssn.ssn_id 
    INNER JOIN te_etablissement_etb etb ON etb.etb_id = stg.stg_id_etablissement 
        INNER JOIN tr_commune_cmn cmn ON cmn.cmn_id = etb.etb_id_commune 
            INNER JOIN tr_departement_dpt dpt ON dpt.dpt_id = cmn.cmn_id_departement 
                INNER JOIN tr_region_rgn rgn ON rgn.rgn_id = dpt.dpt_id_region 
    INNER JOIN tj_stg_concerner_dsc_scd scd ON scd.scd_id_stage = stg.stg_id_session 
        INNER JOIN te_discipline_dsc dsc ON dsc.dsc_id = scd.scd_id_discipline 
            INNER JOIN te_concours_ccr ccr ON ccr.ccr_id_discipline = dsc.dsc_id 
                INNER JOIN th_etudiant_etu etu ON etu.etu_id_concours = ccr.ccr_id 
LEFT OUTER JOIN tj_cnd_inscrire_ssn_cis cis ON cis.cis_id_session = ssn.ssn_id
WHERE etu.etu_id_candidat = :idEtudiant 
GROUP BY ssn.ssn_id, ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin, ssn_capacite, 
    cmn.cmn_nom, dpt.dpt_numero, rgn.rgn_nom
HAVING COUNT(cis.cis_id_session) < ssn.ssn_capacite
Sachant que cette requête sera lancée sur une BDD MySQL, qui n'est pas fort pour les requêtes corrélées, je dirais intuitivement que la seconde est meilleure mais j'aimerais avoir confirmation.

Le challenge suivant étant de trouver l'équivalent en EJBQL, mais là on sort du cadre de ce forum. Si toutefois quelqu'un peut m'aider, je suis preneur !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h54.


 
 
 
 
Partenaires

Hébergement Web