Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/05/2011, 14h22   #1
Invité de passage
 
Inscription : février 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 13
Points : 4
Points : 4
Par défaut problème requête left outer

Bonjour,

Je suis confronté à un problème que je n'arrive pas expliquer :/
Je dois afficher plusieurs compteurs reprenant les enregistrements d'une table (t2) pour tous les users présents dans une autre table (t1).

Voici ma requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
SELECT 
	cor.cdcorr, 
	count(ali1.cdcorr) AS totalActesEnAlerte, 
	count(ali2.cdcorr) AS totalActesEnAlerteHC, 
	count(ali3.cdcorr) AS totalActesNonLus, 
	count(ali4.cdcorr) AS totalActesNonLusHC
FROM t1 cor 
	LEFT JOIN t2 ali1
		ON (cor.cdcorr=ali1.cdcorr AND (ali1.TYPALR = 'I' OR ali1.TYPALR = 'P' OR ali1.TYPALR = 'B') AND (ali1.ETALER = 'N'))
	LEFT JOIN t2 ali2
		ON (cor.cdcorr = ali2.cdcorr AND (ali2.TYPALR = 'I' OR ali2.TYPALR = 'P' OR ali2.TYPALR = 'B') AND (ali2.ETALER <> 'N'	AND ali2.ETALER <> 'C'))
	LEFT JOIN t2 ali3
		ON (cor.cdcorr = ali3.cdcorr AND (ali3.TYPALR = 'C' OR ali3.TYPALR = 'G' OR ali3.TYPALR = 'K') AND (ali3.ETALER = 'N'))
	LEFT JOIN t2 ali4
		ON (cor.cdcorr = ali4.cdcorr AND (ali4.TYPALR = 'C' OR ali4.TYPALR = 'G' OR ali4.TYPALR = 'K') AND (ali4.ETALER <> 'N'	AND ali4.ETALER <> 'C'))
WHERE cor.cdcorr='059709' AND cor.RESEAR = '38'
GROUP BY cor.cdcorr
ORDER BY cor.CDCORR ASC
Cette requête me donne comme résultat :

totalActesEnAlerte : 0
totalActesEnAlerteHC : 0
totalActesNonLus : 25
totalActesNonLusHC : 25

J'ai été étonné des résultats et j'ai divisé cette requête en 4 pour vérifier les compteurs. Et la, voici le résultat, qui eux sont correctes :
totalActesEnAlerte : 0
totalActesEnAlerteHC : 0
totalActesNonLus : 5
totalActesNonLusHC : 5

Noté les 2 derniers compteurs de mes 4 requêtes et ceux de la requête avec les left...Il y a un 5*5 qui traine ^^

J'ai un autre exemple plus probant ou mes compteurs, sur les 4 requêtes me donne :
totalActesEnAlerte : 3
totalActesEnAlerteHC : 27
totalActesNonLus : 120
totalActesNonLusHC : 10

Et lorsque je lance ma requête avec mes 4 jointures, mes compteurs sont :
totalActesEnAlerte : 97200
totalActesEnAlerteHC : 97200
totalActesNonLus : 97200
totalActesNonLusHC : 97200

Je ne comprend pas pourquoi il fait ca :/
Auriez-vous une explication ? Ou alors, je comprend rien...

Il faut que j'affiche ces 4 compteurs pour un user. Y a-t-il une autre méthode permettant de le faire...

Merci,
Vincent
KHVince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 15h40   #2
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Un jointure est un produit.

x lignes * y lignes * z lignes... = bcp de lignes.

Dans votre cas l'usage de SUM & CASE semble indiqué.

Code :
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
 
 
SELECT 
	cor.cdcorr, 
	sum(
case when -- ...condition
ali.TYPALR IN ('I', 'P', 'B') AND (ali.ETALER = 'N')
then 1
else 0
end
) AS totalActesEnAlerte, 
	sum(
case when -- ...condition
ali.TYPALR IN ('I', 'P', 'B') AND ali.ETALER NOT IN ('N', 'C')
then 1
else 0
end
) AS totalActesEnAlerteHC,
<etcetera> 
FROM t1 cor 
INNER JOIN t2 ali ON (
cor.cdcorr = ali.cdcorr
)
WHERE cor.cdcorr='059709' AND cor.RESEAR = '38'
GROUP BY cor.cdcorr
ORDER BY cor.CDCORR ASC
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 16h33   #3
Invité de passage
 
Inscription : février 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 13
Points : 4
Points : 4
Merci,
Ça fonctionne parfaitement.
KHVince est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h20.


 
 
 
 
Partenaires

Hébergement Web