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 :

[Oracle9i] problème left outer join


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut [Oracle9i] problème left outer join
    Bonjour, voici mon problème:
    j'ai 3 tables, A B C
    et je souhaite garder tous les enregistrement de la table A
    je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select A.name, count(B.idA) as "nb"
    from A 
           left outer join B on A.id = B.idA 
           left outer join C on B.id = C.idB
    where B.machin= " "
     
    group by A.name
    le resultat donne:

    asterix nb
    bidon1 10
    bidon3 9

    alors qu'il devrait être:
    asterix nb
    bidon1 10
    bidon2 0
    bidon3 9

    je vous remercie d'avance.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Select
        A.name,
        count(B.idA) as nb
    from
        A 
        left outer join B
          on A.id = B.idA 
         and B.machin= ' '
        left outer join C
          on B.id = C.idB
    group by
        A.name

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Select
        A.name,
        count(B.idA) as nb
    from
        A 
        left outer join B
          on A.id = B.idA 
         and B.machin= ' '
        left outer join C
          on B.id = C.idB
    group by
        A.name
    :s en fait, j'ai déjà essayé cela, mais la partie "and B.machin= ' ' " n'a pas été évoluée. j'ai essayé également avec (+), ca marche avec 2 tables, mais si je veux faire le jointure avec une troisième table, erreur oracle "....outer join..at most one other table"

    Je suis toujours à la recherche d'une solution.....

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il n'y a pas de raison, si votre prédicat B.machin n'a pas été evalué c'est qu'il a été mal écrit, où qu'il y a une gestion de nulls à faire peut-être, difficile à dire avec ce niveau d'information.

    Est-il possible d'en savoir plus sur la requête, et/ou d'avoir un jeu de données qui pose problème ?

    Vous avez raison d'abandonner les (+), il y a de meilleures possibilités avec les outer joins et en plus c'est la norme.

  5. #5
    Membre actif
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Points : 217
    Points
    217
    Par défaut
    Bonjour,
    Comme indiqué par Waldar, il serait bien d'avoir un jeu de test.
    Pour ma part, en oracle 10XE:
    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
    36
     
    create table A (
    id int NOT NULL,
    name char(10)
    );
     
    create table B (
    idB int NOT NULL,
    idA int NOT NULL,
    nameB char(10)
    );
     
    create table C (
    idC int NOT NULL,
    idB int NOT NULL,
    nameC char(10)
    );
     
    insert into A VALUES(1 ,'bidon1');
    insert into A VALUES(2 ,'bidon2');
    insert into A VALUES(3 ,'bidon3');
    insert into A VALUES(4 ,'bidon4');
     
    insert into B VALUES(100,1,'1-100');
    insert into B VALUES(101,1,'1-101');
     
    insert into B VALUES(130,3,'3-130');
    insert into B VALUES(131,3,'3-131');
    insert into B VALUES(132,3,'3-132');
     
    insert into B VALUES(444,4,'4-444');
     
    insert into C VALUES(1000,100,'1-100-1000');
    insert into C VALUES(1001,100,'1-100-1001');
     
    insert into C VALUES(1002,101,'1-101-1002');
    La requete de Waldar fonctionne bien (Avec les adaptations à la bdd que j'ai créée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        A.name,
        count(B.idA) AS nb
    FROM
        A 
        LEFT OUTER JOIN B
          ON A.id = B.idA 
    and B.nameB like '%0%' 
    
        LEFT OUTER JOIN C
          ON B.idB = C.idB
    
    
    GROUP BY A.name

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord, je vous remercie beaucoup de m'avoir répondue.
    Je vais préciser un peu plus en espérant que cela aide à la recherche d'une solution...
    j'ai 5 tables:
    state, epi, ep_def, dom, prj
    (state est la table A)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select state.name as "state",count(epi.STATE_DEF_ID) as "nb instance echanges"
    from state 
    left outer join epi on state.id = epi.STATE_DEF_ID and epi.START_TIME<='31/05/2009 23:59:59' and
         epi.START_TIME>='01/05/2009 00:00:00' 
    left outer join ep_def on ep_def.ID = epi.EP_DEF_ID
    left outer join dom on dom.ID = ep_def.DOMAIN_ID
    left outer join prj on prj.ID = dom.PROJECT_DEF_ID
    where prj.NAME = 'NOTATION' or epi.STATE_DEF_ID is null 
     
    group by state.NAME

    le resultat:
    state nb instance echanges
    Abandon (manuel) 0
    KO 9
    OK 21
    OK (manuel) 0
    On voit bien les "0", mais il n'y en a pas tout... en fait, il existe 5 enregistrements dans la table "state": Abandon (manuel), KO, OK, OK (manuel) et Pending. C'est assez bizarre qu'il m'a pas affiché 5 lignes...mais 4. j'ai dû faire une erreur dans les jointures.

    je vous remercie d'avance.

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je précise un poil plus:

    dans la requête, si j'enlève "or epi.STATE_DEF_ID is null", j'obtiens le résultat suivant:


    state nb instance echanges
    KO 9
    OK 21

    les left outer join sont ignorés...

    Quand j'ai répondu à Waldar que la partie "and" n'a pas été évaluée, c'est à propos de cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select state.name as "state",count(epi.STATE_DEF_ID) as "nb instance echanges"
    from state 
    left outer join epi on state.id = epi.STATE_DEF_ID and epi.START_TIME<='31/05/2009 23:59:59' and
         epi.START_TIME>='01/05/2009 00:00:00' 
    left outer join ep_def on ep_def.ID = epi.EP_DEF_ID
    left outer join dom on dom.ID = ep_def.DOMAIN_ID
    left outer join prj on prj.ID = dom.PROJECT_DEF_ID and prj.NAME = 'NOTATION'
    group by state.NAME
    j'ai obtenu le résultat suivant :

    state nb instance echanges
    Abandon (manuel) 0
    KO 66
    OK 583
    OK (manuel) 0
    Pending 127380

    à partir du résultat obtenu, je conclus que "and prj.NAME = 'NOTATION' " n'a pas été évalué, car les chiffres sont trop grands...

Discussions similaires

  1. Problème Left outer join et Ria (ou Edmx?)
    Par Golzinne dans le forum Silverlight
    Réponses: 2
    Dernier message: 06/09/2011, 14h35
  2. Problème left outer join et group by
    Par maya13400 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/09/2010, 20h40
  3. probléme left outer join
    Par biba158 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/07/2007, 12h29
  4. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  5. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17

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