Arjuna Aircraft Ident.: F-MBSD | Dans un premier temps, le "DISTINCT" de la sous-requête est inutile. On le vire, allez, 10% plus rapide
Ensuite < and >, c'est "between". Ca change rien niveau rapidité, mais c'est plus joli.
De même, on alias les tables, et on préfixe les champs, c'est pas très utile pour le moteur de requête, mais ça aide les gens qui lisent la requête, et surtout, ça te permet de modifier la requête sans devoir passer 1 heure à remettre tout en forme.
Code :
- SELECT
- a.GR,
- a.Nom + ' ' + a.Prenom + ' (' + a.Matricule_Agent + ')' Identite,
- a.Adresse,
- a.Telephone,
- a.Bureau,
- a.Mobile
- FROM Agents a
- WHERE a.GR = '12' -- C'est quoi ces ' autour d'un nombre ?
- AND a.Matricule_Agent IN (
- SELECT aff.Matricule_Agent
- FROM Affectations aff
- WHERE aff.Type_Affectation = 0
- AND aff.Jour between 38412 38419 -- Je crois que le between est inclusif, à ce moment, c'est 38413 et 48418
- )
|
Maintenant, remplaçons cet affreux "IN" par un "EXISTS" (20 à 30% plus rapide, et sans limite d'élément dans la sous-requête)
Code :
- SELECT
- a.GR,
- a.Nom + ' ' + a.Prenom + ' (' + a.Matricule_Agent + ')' Identite,
- a.Adresse,
- a.Telephone,
- a.Bureau,
- a.Mobile
- FROM Agents a
- WHERE a.GR = '12' -- C'est quoi ces ' autour d'un nombre ?
- AND EXISTS (
- SELECT NULL
- FROM Affectations aff
- WHERE aff.Matricule_Agent = a.Matricule_Agent
- AND aff.Type_Affectation = 0
- AND aff.Jour between 38412 38419 -- Je crois que le between est inclusif, à ce moment, c'est 38413 et 48418
- )
|
Et là, j'ai bien l'impression que tu pourrais simplement faire une jointure...
Code :
- SELECT
- a.GR,
- a.Nom + ' ' + a.Prenom + ' (' + a.Matricule_Agent + ')' Identite,
- a.Adresse,
- a.Telephone,
- a.Bureau,
- a.Mobile
- FROM Affectations aff, Agents a
- WHERE a.GR = '12' -- C'est quoi ces ' autour d'un nombre ?
- AND aff.Matricule_Agent = a.Matricule_Agent
- AND aff.Type_Affectation = 0
- AND aff.Jour between 38412 38419 -- Je crois que le between est inclusif, à ce moment, c'est 38413 et 48418
|
Si Matricule_Agent est doublonné dans Affectations, alors il faut faire un distinct (c'est très balo, parceque là ça pète toutes les optimisations...)
Code :
- SELECT DISTINCT
- a.GR,
- a.Nom + ' ' + a.Prenom + ' (' + a.Matricule_Agent + ')' Identite,
- a.Adresse,
- a.Telephone,
- a.Bureau,
- a.Mobile
- FROM Affectations aff, Agents a
- WHERE a.GR = '12' -- C'est quoi ces ' autour d'un nombre ?
- AND aff.Matricule_Agent = a.Matricule_Agent
- AND aff.Type_Affectation = 0
- AND aff.Jour between 38412 38419 -- Je crois que le between est inclusif, à ce moment, c'est 38413 et 48418
|
En tout cas, même avec le distinct, ça peut pas être pire qu'avant |