Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 07/02/2007, 17h16   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 65
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 65
Points : 11
Points : 11
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 :
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 :
 SELECT DISTINCT T.DATEDEBUT FROM FRIENDLY_TUTEUR T
Vous avez une idée ??? Je travaille sous oracle 9.2
Merci a vous.
Xoco
xoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2007, 17h28   #2
Membre du Club
 
Inscription : août 2004
Messages : 36
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France

Informations forums :
Inscription : août 2004
Messages : 36
Points : 41
Points : 41
tu n'as pas mis la requete qui est censée te ramener tes 12 lignes.
pas facile de te dire ce qui cloche
iron_c est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2007, 17h39   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 65
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 65
Points : 11
Points : 11
oooppss.. effectivement,

la requete qui est censé me rammener 12 results et qui m en rammene 32 c :
Code :
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...
xoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2007, 17h41   #4
Membre du Club
 
Inscription : août 2004
Messages : 36
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France

Informations forums :
Inscription : août 2004
Messages : 36
Points : 41
Points : 41
il manque une jointure entre les 2 tables ...

and a.matricule = t.matricule par exemple
iron_c est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2007, 18h03   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 65
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 65
Points : 11
Points : 11
effectivement, ca marche avec la requete :

Code :
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+++
xoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2007, 10h02   #6
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 65
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 65
Points : 11
Points : 11
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 :
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 ???
xoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2007, 10h14   #7
Membre du Club
 
Inscription : août 2004
Messages : 36
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France

Informations forums :
Inscription : août 2004
Messages : 36
Points : 41
Points : 41
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 ...
iron_c est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2007, 10h22   #8
Membre éprouvé
 
Avatar de chrifo
 
Inscription : juillet 2006
Messages : 445
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 445
Points : 418
Points : 418
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.
chrifo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2007, 10h37   #9
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 65
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 65
Points : 11
Points : 11
Merci pour vos reponses les amis !!

Effectivement, avec vos conseils, j'ai réussi le coup, la bonne requete :

Code :
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 ???
xoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2007, 11h26   #10
Membre éprouvé
 
Avatar de chrifo
 
Inscription : juillet 2006
Messages : 445
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 445
Points : 418
Points : 418
Je pense que ce topic répondra à ta question :
http://www.developpez.net/forums/sho...d.php?t=179600
chrifo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2007, 11h33   #11
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 65
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 65
Points : 11
Points : 11
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
xoco 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 13h00.


 
 
 
 
Partenaires

Hébergement Web