Bonjour,

Voilà dans le cadre d'une newsletter qui présente les annonces en rapport avec les choix laissés par les internautes, je cherche à construire un web mail.

Donc nous avons les tables suivantes :
internautes (email, prix, departement, transaction, type de bien)
annonce (annonce_id, prix, #insee_id, promo, transaction, type de bien)
insee(insee_id, ville, dep, region)
webmail(#annonce_id,#email,prix,codepos,ville,transaction,type de bien_descriptif, Promo, region)

Le truc est de mettre dans une table pour mon webmail les annonce correspondant au critères retenu par l'internaute avec un prix a +ou- 20%

Pour cela j'ai cette requête qui fonctionne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
INSERT INTO webmail(annonce_id,email,prix,codepos,ville,transaction,type de bien, Promo, region) 
SELECT A.annonce_id,I.email,A.prix,Ii.codepos,Ii.Ville,A.transaction,A.type de bien, CASE WHEN Promo = 1 THEN 2 ELSE 0 END,  Ii.region
FROM annonces A INNER JOIN insee Ii WITH(NOLOCK) ON Ii.insee_id=A.insee_id
INNER internautes I WITH(NOLOCK) ON I.transaction=A.transaction 
AND I.type de bien=A.type de bien 
AND SUBSTRING(A.insee_id,1,2)=I.departement 
WHERE A.prix BETWEEN (I.prix*0.8) AND (I.prix*1.2)
Cette requête fonctionne avec un temps de traitement tout a fait acceptable.

Par contre là ou cela se complique c'est que si pour mes emails dans ma table webmail je n'ai pas 5 promos, je dois élargir avec les promos à la région...

Et là j'ai essayé avec un curseur de la sorte :

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
20
21
22
23
24
25
26
27
DECLARE @NB_TG int
DECLARE @email varchar(200)
DECLARE @region varchar(200)
 
DECLARE Cu CURSOR FOR
	select count(nullif(tete_gondole, 0))as nb_TG, email, region FROM webmail GROUP BY email, region HAVING COUNT(*) < 5
OPEN Cu
 
FETCH NEXT FROM Cu INTO @NB_TG, @email, @region
 
WHILE @@Fetch_Status = 0
BEGIN
INSERT INTO webmail_tmp(annonce_id,email,prix,codepos,ville,transaction,type de bien, Promo, region) 
SELECT TOP(5 - @NB_TG) A.annonce_id,I.email,A.prix,Ii.codepos,Ii.Ville,A.transaction,A.type de bien, Promo,  Ii.region
FROM annonces A WITH(NOLOCK)  	
INNER JOIN insee Ii WITH(NOLOCK) ON Ii.insee_id=A.insee_id
AND Ii.region = @region
INNER JOIN webmail wm WITH(NOLOCK) ON email = @email
AND A.transaction_id = wm.tr_id
AND A.typebien_id = wm.tb_id	
WHERE A.prix BETWEEN (wm.prix_internaute*0.8) AND (wm.prix_internaute*1.2) 
AND A.Promo= 1
AND A.Annonce_id NOT IN (SELECT annonce_id FROM imex.dbo.webmail_tmp)
FETCH NEXT FROM Cu INTO @NB_TG, @email, @region
END
CLOSE Cu
DEALLOCATE Cu
Qui fonctionne (enfin je crois ) mais par contre qui est très très lente...

C'est pourquoi je fais appel à vos lumières pour tenter de m'aider à optimiser celà.

PS : le fait de placer les Promo du département avec une promo à 2 et celle de la région à 1 me permet ensuite de pouvoir afficher d'abord celle du département puis celle de la région avec un ORDER BY Promo DESC.

D'avance merci pour votre aide !