Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

requete sur une suite de requete => lenteur

11 réponses
Avatar
eric.zzzz
Bonjour,
Je suis sous Access 2003.
Mes requetes sont souvent bas=E9es sur des requetes qui, elles-m=EAme sont
bas=E9es sur des requetes, etc... (la table de d=E9part d=E9passe 40 000
lignes).Lorsque la cha=EEne de sous-requetes d=E9passe 5 ou 6 requetes,
l'ex=E9cution est tr=E8s lente.
A d=E9faut de solution, pour =E9viter ces lenteurs, je cr=E9e une nouvelle
base dans laquelle il n'y a que la derni=E8re requete bas=E9e sur une
table qui est une importation de la derni=E8re sous-requete.
Existe-t-il d'autres m=E9thodes pour =E9viter ces lenteurs ?
Merci d'avance
Eric

1 réponse

1 2
Avatar
Michel__D
Bonjour,

a écrit :
> Bonjour
>
> Il n'y a pas d'urgence...Fais ce que tu peux;... ce que tu m'as donné
> m'a bcp servi
>
> Je cherche à avoir le taux d'emploi par diplome.
> La difficulté vient du fait qu'il ne faut retenir que les
> enregistrements qui sont > 34 par année (Count(DIPLOME_PRE)>34) et il
> faut que la somme des enregistrements sur les 3 années (2006, 2007 et
> 2008) soit > 120
> C'est pour cela que j'ai procédé en plusieurs étapes, d'où trop de
> requetes => lenteur.
>
>
>
> I) 1re étape: Exclusion des enregistrements <35 et dont le total <120
>
>
> req1.1 : je crée "Req1" qui exclut les enregistrements <35 :
> SELECT Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200,
> Sum(Terminants2.POND) AS SommeDePOND, Count(Terminants2.DIPLOME_PRE) AS
> CompteDeDIPLOME_PRE, Terminants2.ANNEE
> FROM Terminants2
> GROUP BY Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200,
> Terminants2.ANNEE HAVING (((Count(Terminants2.DIPLOME_PRE))>34));
>
>
>
> req 1.2 : Avec "Req1", je crée une req croisée par année "Req2":
> TRANSFORM Sum(Req1.CompteDeDIPLOME_PRE)
> SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> FROM Req1
> GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
>
>
>
> req 1.3 : Avec "Req2", j'exclus les enregistrements <120 sur les 3
> années => "Req3" :
> SELECT Req2.DIPLOME_PRE, Req2.LIBELLE_LONG_200, Req2.[2006],
> Req2.[2007], Req2.[2008], [2006]+[2007]+[2008] AS total
> FROM Req2
> WHERE ((([2006]+[2007]+[2008])>120))
> ORDER BY Req2.DIPLOME_PRE;
>
> Avec cette 1re sous-requete "Req3", je n'ai pas l'info essentielle qui
> est le champ "POND"; je n'ai fait pour l'instant qu'exclure les
> enregistrements qui ne m'interessent pas.
>
>
>
> II) 2me étape : traitement de l'info "POND"
> req 2.1 : Avec "Req1", je crée une req croisée par année "Req4" :
> TRANSFORM Sum(Req1.SommeDePOND) AS SommeDePOND
> SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> FROM Req1
> GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> PIVOT Req1.ANNEE;
>
>
>
> III) 3me étape : Jointure entre 1re et 2me étape ("Req3" avec "Req4" qui
> donnent "Req5") pour ne retenir que les données POND qui correspondent à
> mes critères de la 1re étape
> SELECT Req4.* FROM Req4 INNER JOIN Req3 ON Req4.DIPLOME_PRE > Req3.DIPLOME_PRE;
>
>
>
> IV) 4° étape : requete qui me donnent ceux qui sont en emploi =>"Req6"
> TRANSFORM Sum(Terminants2.POND) AS SommeDePOND
> SELECT Terminants2.DIPLOME_PRE
> FROM Terminants2
> WHERE (((Terminants2.KSIQ)="3"))
> GROUP BY Terminants2.DIPLOME_PRE, Terminants2.KSIQ
> PIVOT Terminants2.ANNEE;
>
>
>
> V) Ultime étape : le taux d'emploi (jointure entre 3° et 4° étape)
> SELECT Req6.DIPLOME_PRE, Req6.LIBELLE_LONG_200, Req6.[2006],
> Req5.[2006], Req6.[2007], Req5.[2007], Req6.[2008], Req5.[2008]
> FROM Req6 INNER JOIN Req5 ON Req6.DIPLOME_PRE = Req5.DIPLOME_PRE;
>
> Merci beaucoup
>
> Eric

Regarde si les 3 requêtes suivantes te donne le résultat souhaité :

Req1:
SELECT T2.[DIPLOME_PRE]
FROM [SELECT T1.ANNEE, T1.[DIPLOME_PRE],
Count(T1.[DIPLOME_PRE] AS CompteDe
FROM Terminants2 AS T1
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
HAVING Count(T1.[DIPLOME_PRE])>34]. AS T2
WHERE T2.ANNEE Between 2006 And 2008
GROUP BY T2.[DIPLOME_PRE]
HAVING Sum(T2.CompteDe)>120;

Req2:
SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE],
Sum(T1.POND) AS SommeDePOND
FROM Terminants2 AS T1 INNER JOIN Req1 AS T2
ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE]
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
UNION
SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND)
FROM Terminants2 AS T1 INNER JOIN Req1 AS T2
ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE]
WHERE T1.KSIQ="3"
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];

TRANSFORM First(T1.SommeDePOND) AS Valeur
SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
FROM Req2 AS T1 INNER JOIN V_FormDiplOct2008 AS T2
ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME]
GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
PIVOT T1.ANNEE & "_" & T1.ChampPivot;
1 2