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

Oracle Discussion :

Pb de join !


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 47
    Points
    47
    Par défaut Pb de join !
    Salut a tous,

    Un petit souci sur une simple requete.
    J'ai 2 requetes qui vont chercher les memes infos, mais dans 2 tables différentes...
    l'une me sors 4 resultat, l autre 8.
    J aimerai faire une requete qui me sort donc 12 resultat.
    Pourtant, j en obtient 32 (8x4).

    Table 1 : Liste personnel
    matricule
    dateStageTuteur

    Requete 1 sors 4 resultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct A.matricule,A.DATESTAGETUTEUR
    FROM Liste_Personnel A where 
    (A.STAGETUTEUR ='1' OR A.DATESTAGETUTEUR<>to_date('3000-12-31','YYYY/MM/DD'))
    Table 2 : Tuteurs
    matricule
    codeTuteur
    DateDebutStage

    Requete 2 sors 8 resultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select distinct T.DATEDEBUT FROM FRIENDLY_TUTEUR T
    Vous avez une idée ??? Je travaille sous oracle 9.2
    Merci a vous.
    Xoco

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    tu n'as pas mis la requete qui est censée te ramener tes 12 lignes.
    pas facile de te dire ce qui cloche

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    oooppss.. effectivement,

    la requete qui est censé me rammener 12 results et qui m en rammene 32 c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct A.matricule,T.DATEDEBUT,A.DATESTAGETUTEUR
    FROM FRIENDLY_PNC A, FRIENDLY_TUTEUR T
    where  A.STAGETUTEUR ='1'
    et il n accepte pas de groupby A.matricule.... il me designe T en me disant: not a group by expression....

    De toutes facons, avec un group by, je ne sais avoir la date associé au matricule...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    il manque une jointure entre les 2 tables ...

    and a.matricule = t.matricule par exemple

  5. #5
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    effectivement, ca marche avec la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select distinct A.matricule,T.DATEDEBUT,A.DATESTAGETUTEUR
    FROM FRIENDLY_PNC A LEFT JOIN FRIENDLY_TUTEUR T
    ON A.matricule = T.matricule
    WHERE (A.STAGETUTEUR ='1' OR A.DATESTAGETUTEUR<>to_date('3000-12-31','YYYY/MM/DD')) OR DATEDEBUT IS NOT NULL
    Merci BCPPPP+++

  6. #6
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    ReSalut à tous,

    Effectivement, la requete marche. Maintenant, j essaie de la combiner avec la requete originale qui verifie au passage si les personnes selectionnées travaillent toujours dans la boite, etc.... la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT A.MATRICULE, A.NOM, A.PRENOM, N.IDDIVISION, N.IDSECTEUR,N.IDGROUPEGINQ,  C.codeSpecialiteOperationnelle, c.tri,T.DATEDEBUT,A.DATESTAGETUTEUR, F.TAUX,J.IDGROUPEPLANNING 
    FROM FRIENDLY_PNC A LEFT JOIN FRIENDLY_TUTEUR T ON A.MATRICULE = T.MATRICULE ,   FRIENDLY_FONCTION C, FRIENDLY_GROUPE_GINQ D, FRIENDLY_TAUX_UTILISATION_PN F, FRIENDLY_GROUPE_PLANNING J,FRIENDLY_GINQ N 
    WHERE  A.MATRICULE = C.MATRICULE AND A.MATRICULE = D.MATRICULE 
    AND (A.STAGETUTEUR ='1' OR A.DATESTAGETUTEUR<>to_date('3000-12-31','YYYY/MM/DD'))  
    AND D.DATEDEBUT <= to_date(SYSDATE,'DD/MM/YY') AND (D.DATEFIN IS NULL OR D.DATEFIN >=to_date(SYSDATE,'DD/MM/YY'))  
    AND A.MATRICULE = F.MATRICULE AND D.IDGROUPEGINQ = N.IDGROUPEGINQ AND A.MATRICULE = J.MATRICULE 
    AND c.DATEDEBUT <= to_date(SYSDATE,'DD/MM/YY') AND c.DATEFIN >= to_date(SYSDATE,'DD/MM/YY') 
    AND F.DATEDEBUT <= to_date(SYSDATE,'DD/MM/YY') AND F.DATEFIN >= to_date(SYSDATE,'DD/MM/YY') 
    AND J.DATEDEBUT <= to_date(SYSDATE,'DD/MM/YY') AND J.DATEFIN >= to_date(SYSDATE,'DD/MM/YY')  
    OR T.DATEDEBUT IS NOT NULL AND ((A.DATEFINDEFINCONTRAT > sysdate or A.DATEFINDEFINCONTRAT is null) 
    AND (A.DATEDEBUTDEFINCONTRAT > sysdate or A.DATEDEBUTDEFINCONTRAT is null)) order by IDGROUPEGINQ,tri, NOM
    La, la requete prends une plombe dans Toad, et ensuite, message d'erreur :

    "unable to extend temp segment by 128 in tablespace TSTEMP"...., en gros, je retourne un trop grand nombre nombre de resultat, alors que je ne devrais en retourner que 12

    Auriez vous une idée sur comment intégrer la requete a ses contraintes ???

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    Re-bonjour,
    toujours le même soucis,
    tu as pas mal de tables dans ta clause FROM, mais aucune jointure entre elles

    Tu fais donc un profuit cartésien, ce qui explose du tablespace temporaire.
    à toi de voir quelles sont les jointures que tu dois faire entre ces tables ...

  8. #8
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    En fait c'est pire que ça :
    Les jointures sont bien présentes, mais certaines dans la clause where. On trouve aussi un "OR", qui fait que ces jointures dans la clause where ne sont pas toujours prises en compte ...
    Le mieux ce serait de commencer par mettre ta requête au propre.

    PS : "unable to extend temp segment by 128 in tablespace TSTEMP", ça ne veut pas forcément dire que tu vas ramener trop de résultats, mais ça signifie simplement que le tablespace temporaire (i.e., en gros, de calcul) est plein.

  9. #9
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos reponses les amis !!

    Effectivement, avec vos conseils, j'ai réussi le coup, la bonne 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
     
    SELECT A.MATRICULE, A.NOM, A.PRENOM, N.IDDIVISION, N.IDSECTEUR,N.IDGROUPEGINQ,  C.codeSpecialiteOperationnelle, c.tri,T.DATEDEBUT,A.DATESTAGETUTEUR, F.TAUX,J.IDGROUPEPLANNING 
    FROM FRIENDLY_PNC A LEFT JOIN FRIENDLY_TUTEUR T ON A.MATRICULE = T.MATRICULE
    LEFT JOIN FRIENDLY_FONCTION C ON A.MATRICULE = C.MATRICULE
    LEFT JOIN FRIENDLY_GROUPE_GINQ D ON A.MATRICULE = D.MATRICULE
    LEFT JOIN FRIENDLY_TAUX_UTILISATION_PN F ON A.MATRICULE = F.MATRICULE
    LEFT JOIN FRIENDLY_GROUPE_PLANNING J ON A.MATRICULE = J.MATRICULE ,FRIENDLY_GINQ N 
    WHERE D.IDGROUPEGINQ = N.IDGROUPEGINQ
    AND D.DATEDEBUT <= to_date(SYSDATE,'DD/MM/YY') AND (D.DATEFIN IS NULL OR D.DATEFIN >=to_date(SYSDATE,'DD/MM/YY'))  
    AND c.DATEDEBUT <= to_date(SYSDATE,'DD/MM/YY') AND c.DATEFIN >= to_date(SYSDATE,'DD/MM/YY') 
    AND F.DATEDEBUT <= to_date(SYSDATE,'DD/MM/YY') AND F.DATEFIN >= to_date(SYSDATE,'DD/MM/YY') 
    AND J.DATEDEBUT <= to_date(SYSDATE,'DD/MM/YY') AND J.DATEFIN >= to_date(SYSDATE,'DD/MM/YY')  
    AND (A.DATEFINDEFINCONTRAT > sysdate OR A.DATEFINDEFINCONTRAT IS NULL) 
    AND (A.DATEDEBUTDEFINCONTRAT > sysdate OR A.DATEDEBUTDEFINCONTRAT IS NULL)
    AND ( (A.STAGETUTEUR ='1' OR A.DATESTAGETUTEUR<>to_date('3000-12-31','YYYY/MM/DD')) OR T.DATEDEBUT IS NOT NULL) 
     ORDER BY IDGROUPEGINQ,tri, NOM
    Je passe le post en résolu, un petite question subsidiaire : quelle est la différence entre un JOIN et une clause WHERE Mat1=mat2 ???

  10. #10
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Je pense que ce topic répondra à ta question :
    http://www.developpez.net/forums/sho...d.php?t=179600

  11. #11
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    j'en conclu que c a peu pres la meme chose, saus pour les grosse requetes ou faut essayer les 2. Ca a l air de diminuer la complexité des calculs, et c plus clair dans la requete....

    En tous cas, MERCI Chrifo et Iron_c, vous me retirez une épine du pied

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

Discussions similaires

  1. Mysql Inner join
    Par ..:: Atchoum ::.. dans le forum Requêtes
    Réponses: 3
    Dernier message: 25/10/2007, 12h21
  2. Pas de JOIN sous Oracle (vraiment dommage...)
    Par Isildur dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/03/2007, 11h28
  3. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 21h25
  4. Réponses: 5
    Dernier message: 04/08/2003, 21h50
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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