IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

problème requête left outer


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 12
    Points
    12
    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 : 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
     
    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

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    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 : 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
     
     
    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
    Most Valued Pas mvp

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci,
    Ça fonctionne parfaitement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème dans left outer join
    Par aymen007 dans le forum SQL
    Réponses: 1
    Dernier message: 21/05/2008, 12h03
  2. problème avec LEFT OUTER JOIN
    Par tofque dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/03/2008, 11h57
  3. Problème de left outer join avec Ibatis
    Par sarsipius dans le forum JDBC
    Réponses: 1
    Dernier message: 28/02/2008, 14h51
  4. problème de LEFT OUTER JOIN
    Par Smix007 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 25/07/2007, 18h54
  5. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo