
Envoyé par
elsuket
Bonjour,
Une requête équivalente serait :
1 2 3 4 5 6 7 8 9 10 11
| SELECT E.No_etudiant
, E.Nom
, E.prenom
, COUNT(no_insc) AS nbinsc
FROM dbo.etudiant AS E
LEFT JOIN dbo.inscription AS I
ON E.no_etudiant = I.no_etudiant
WHERE E.date_nais > DATEADD(year, -16, GETDATE())
AND E.date_nais <= DATEADD(year, -15, GETDATE())
AND I.Date_insc BETWEEN '20140101' AND '20140201' -- Ces deux dates sont à minuit, inclus
GROUP BY E.No_etudiant, E.Nom, E.prenom |
La différence ici, c'est que comme les prédicats sont
cherchable, on fera de la recherche dans un index sur les colonnes de type date, et non pas un balayage complet.
En effet, il est plus simple de chercher des valeurs dans une plage, que d'appliquer d'abord une fonction sur une colonne, et d'en comparer ensuite les valeurs (typiquement le cas du DATEDIFF dans votre requête).
@++

Il faudrait mettre la condition
I.Date_insc BETWEEN '20140101' AND '20140201' -- Ces deux dates sont à minuit, inclus
dans la jointure externe :
1 2 3 4 5 6 7 8 9 10 11
| SELECT E.No_etudiant
, E.Nom
, E.prenom
, COUNT(no_insc) AS nbinsc
FROM dbo.etudiant AS E
LEFT JOIN dbo.inscription AS I
ON E.no_etudiant = I.no_etudiant
AND I.Date_insc BETWEEN '20140101' AND '20140201' -- Ces deux dates sont à minuit, inclus
WHERE E.date_nais > DATEADD(year, -16, GETDATE())
AND E.date_nais <= DATEADD(year, -15, GETDATE())
GROUP BY E.No_etudiant, E.Nom, E.prenom |
Partager