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

Langage SQL Discussion :

Full outer join Resultat imprévu


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 190
    Points : 76
    Points
    76
    Par défaut Full outer join Resultat imprévu
    Bonjour,
    J'ai appliqué le principe de l'inner join et de l'outer join, or au vue des résultats je n'obtiens pas vraiment ce que je veux, la requete a tendance à multiplier par deux les valeurs de la table de gauche ==> voici ma requete
    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
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    select T1.intervenant, T1.profile ,T1.jours_prestes_ext, T2.jours_prestes_int
    from
    (Select
    B.intervenant, emp.PROFILE,
    to_number((sum(to_char(HEURES_PRESTEES_TACHE,'HH24'))*60+sum(to_char(HEURES_PRESTEES_TACHE,'MI')))/(8*60)) as jours_prestes_ext
    from 
    ACTIVITE B, employer emp
    where B.FIRNUM='INFEUROPE'
    and B.INTERVENANT = emp.INTERVENANT 
    and EADNUM like 'Lot 4/%-ext'
    and DESCRIPTION_TACHE is not null
    and to_char(DATE_ACTIVITE,'YYYYMM')='200812'
    and to_char(DATE_ACTIVITE,'DY') not in ('SAT','SUN')
    and B.CENTRE_DE_COUT != 'Divers'
    and emp.PROFILE in ('ENG.TEST','ENG.INT')
    group by (B.intervenant, emp.profile)
    ) T1 
    inner join
    (select B.intervenant,emp.PROFILE ,to_number((sum(to_char(HEURES_PRESTEES_TACHE,'HH24'))*60+sum(to_char(HEURES_PRESTEES_TACHE,'MI')))/(8*60)) as jours_prestes_int
    from ACTIVITE B, employer emp
    where 
    B.FIRNUM='INFEUROPE' 
    and B.INTERVENANT = emp.INTERVENANT
    and EADNUM like 'Lot 4/%-int'
    and DESCRIPTION_TACHE is not null
    and to_char(DATE_ACTIVITE,'YYYYMM')='200812'
    and to_char(DATE_ACTIVITE,'DY') not in ('SAT','SUN')
    and B.CENTRE_DE_COUT != 'Divers'
    and emp.PROFILE in ('ENG.TEST','ENG.INT')
    group by (B.intervenant, emp.PROFILE)
    ) T2
    on
    T1.intervenant = T2.intervenant
    J'ai des bonnes valeurs, mais en rajoutant la table employer j'obtiens des résultats non conformes.
    Il y a certainement quelque chose qui m'échappe en sql pour avoir ce genre de résultats.
    Je vous remercie pour tout aide.
    Bien cordialement

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Vous pouvez écrire votre requête en une seule passe (vu les fonctions utilisées je suppose qu'il s'agit d'Oracle).
    J'en profite pour corriger quelques énormités (sum(to_char), c'est mal) :
    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
    SELECT
        B.intervenant,
        emp.PROFILE,
        sum(case when substr(EADNUM, -4, 4) = '-ext' then 
          to_number(to_char(HEURES_PRESTEES_TACHE, 'HH24'))*60 + to_number(to_char(HEURES_PRESTEES_TACHE,'MI'))
          else 0 end) / (8*60) AS jours_prestes_ext,
        sum(case when substr(EADNUM, -4, 4) = '-int' then 
          to_number(to_char(HEURES_PRESTEES_TACHE, 'HH24'))*60 + to_number(to_char(HEURES_PRESTEES_TACHE,'MI'))
          else 0 end) / (8*60) AS jours_prestes_int
    FROM
        ACTIVITE B INNER JOIN employer emp
          ON B.INTERVENANT = emp.INTERVENANT
    WHERE 
        B.FIRNUM = 'INFEUROPE' 
    AND EADNUM LIKE 'Lot 4/%'
    AND DESCRIPTION_TACHE IS NOT NULL
    AND to_char(DATE_ACTIVITE, 'YYYYMM') = '200812'
    AND to_char(DATE_ACTIVITE, 'DY') NOT IN ('SAT', 'SUN')
    AND B.CENTRE_DE_COUT <> 'Divers'
    AND emp.PROFILE IN ('ENG.TEST', 'ENG.INT')
    GROUP BY
        B.intervenant,
        emp.PROFILE
    Il manque aussi beaucoup d'alias sur vos colonnes, aliaser les tables c'est nécessaire mais il faut les utiliser partout.

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 190
    Points : 76
    Points
    76
    Par défaut
    Je vous remercie Waldar pour votre participation, le problème a été résolu, en fait le résultat était imprévu, parce que j'avais une table dans ma base qui était composée de deux clef, et la jointure, n'a pas été fait sur la deuxième clef, ce qui explique les résultats incohérents et totalement incompréhensifs.

    ...vu les fonctions utilisées je suppose qu'il s'agit d'Oracle..
    Absoluement c'est bel et bien un serveur de base de données Oracle 10 g.

    J'en profite pour corriger quelques énormités (sum(to_char), c'est mal) :
    Je vous en remercie, en fait une bonne partie de ces requêtes m'ont été envoyé par notre dba lui même. Mon manque de connaissance sur Oracle ne m'a pas aidé à trouver ce genre d'erreurs. Ce dba avait deja mauvaise presse, parce que la base de données relationnelle qu'il a fait n'est pas génial, et ça jazz beaucoup à son sujet. Vous ne faîtes que confirmer le sentiment général à son sujet .
    Je tiens à vous remercier encore.

    Bien cordialement

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

Discussions similaires

  1. L'équivalent de FULL OUTER JOIN sous ACCESS
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/03/2013, 12h36
  2. Erreur FULL OUTER JOIN
    Par SwiTz dans le forum Requêtes
    Réponses: 14
    Dernier message: 02/04/2009, 13h33
  3. [Oracle 9] Probleme. FULL OUTER JOIN
    Par West01 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/10/2006, 07h46
  4. [ORACLE 9i] Equivalent du Full Outer Join
    Par Worldofdada dans le forum Oracle
    Réponses: 10
    Dernier message: 02/11/2005, 14h56
  5. Remplacer FULL OUTER JOIN
    Par funrighd dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/07/2004, 10h54

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