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.
La seconde fait un GROUP BY et une restriction HAVING.
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 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
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.
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 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
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 !
Partager