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 25/01/2007, 17h12   #1
in
Membre Expert
 
Avatar de in
 
Inscription : avril 2003
Messages : 1 609
Détails du profil
Informations personnelles :
Localisation : France, Finistère (Bretagne)

Informations forums :
Inscription : avril 2003
Messages : 1 609
Points : 1 564
Points : 1 564
Par défaut Aide sur création de requete arborescente

Bonjour,

voilà je suis bien embété ... je n'arrive pas à créer la requete que je souhaite. Pourtant, ça me parait faisable, voir même simple (c'est ce qui m'énerve le plus ) Je souhaiterais juste avoir un ou deux conseils ...


Disons que j'ai une table comme ceci :

ID TYPE PARENT_ID
--------------------------------
1 EPS
2 PRG 1
3 EPS 2
4 PRG 3
5 PU 4
6 PU 3
7 PU 2
--------------------------------

Je souhaite avoir comme résultat de la requete

ID TYPE PARENT_ID
--------------------------------
5 PU 4
6 PU 1
7 PU 1
--------------------------------


En fait je veux obtenir tous les éléments de type PU avec leur "plus proche papa" de type PRG. Les niveaux EPS sont quant à eux des niveaux intermédiaires dont je me fiche.

J'ai donc essayé pas mal de truc à base de connect by et de INNER JOIN mais je m'embrouille.

en fait récupérer le père d'un PU c'est OK mais je n'arrive pas à créer la requête "générale" qui me renvoie une ligne par PU.

Du coup 2 tites questions :
- c'est possible à faire ça quand même ?
- vaut-il mieux que je récupère les fils PU d'un PRG ou alors le père PRG d'un PU ?

Merci d'avance
__________________
"If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/
in est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 17h42   #2
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 62
Points : 15
Points : 15
Tu peux etre plus clair dans ton exemple?
J'ai un peu de mal avec ton explication, et avec ton exemple, un simple

select * from tatable where type='PU';

fonctionnerais....


AH NAN, DSL, J' AI MAL LU !!!
vinczente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 09h17   #3
in
Membre Expert
 
Avatar de in
 
Inscription : avril 2003
Messages : 1 609
Détails du profil
Informations personnelles :
Localisation : France, Finistère (Bretagne)

Informations forums :
Inscription : avril 2003
Messages : 1 609
Points : 1 564
Points : 1 564
Ben en fait j'utilise cette requete pour récupérer le parent PRG d'un PU donné

Code :
1
2
3
4
5
 SELECT *
 FROM matable
 WHERE type='PRG'
 start WITH id = 12136
 connect BY prior parent_id = id
En fait je pense à un truc du style :

Code :
1
2
3
4
5
 SELECT *
 FROM matable
 WHERE type='PRG'
 start WITH id IN (SELECT id FROM matable WHERE type='PU')
 connect BY prior parent_id = id
Là j'ai une ligne PRG par PU. Par contre je n'ai pas l'info de quel PU il s'agit. Et je n'ai aucune colonne dans ce résultat avec laquelle faire une jointure ...

une idée ?
__________________
"If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/
in est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 14h29   #4
in
Membre Expert
 
Avatar de in
 
Inscription : avril 2003
Messages : 1 609
Détails du profil
Informations personnelles :
Localisation : France, Finistère (Bretagne)

Informations forums :
Inscription : avril 2003
Messages : 1 609
Points : 1 564
Points : 1 564
Bon, j'ai finalement réussi à faure cette requete. Par contre elle est vraiment cochonne. J'ai pas regarder le explain plan mais je vois bien qu'elle est optimisée pour ralentir la base

En fait ma requete est basée sur pas mal d'autojointures. Il y a surement moyen d'améliorer ça. Par contre j'ai pas d'idées et j'ai pas l'expérience pour voir à l'instinct d'où vient le problème.

Du coup je vous soumet cette requete. Si vous avez des idées ou tout simplement des remarques ... (par contre j'ai la flemme de tout modifier en "matable" "id" ... ). En fait, il y a un niveau en plus -> TASK qui se trouve sous les PU. Je veux récupérer toutes les TASK avec le PU et le PRG. (le PU est renseigné pour une TASK dans la table)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT   b3.elt_db_id Prog,    -- le parent PRG
	   b1.pu_db_id Proj,     -- le PU
	   p.proj_id projOID,     -- identifiant du PU provenant d'une autre table
	   b2.orig_pu_db_id Origin, -- 1 champ du PU
	   b1.elt_db_id Act,      -- la TASK
	   count(tr.taskrsrc_id) nbRA -- le nombre de sous elements de la TASK
FROM   bi_wbs b3,   -- la table pour le PRG
	 bi_wbs b1 JOIN projwbs p ON b1.pu_db_id = p.wbs_id   -- identifiant PU autre table
	 		   INNER JOIN bi_wbs b2 ON b1.pu_db_id = b2.elt_db_id -- pour le champ origin du PU
	 		   JOIN taskrsrc tr ON b1.elt_db_id = tr.task_id -- ss elt de task
WHERE b1.elt_type='TASK' 
AND	  tr.delete_date IS NULL 
AND   p.delete_date IS NULL
AND   b3.elt_db_id = (SELECT elt_db_id 
					  FROM bi_wbs b4
					  WHERE b4.elt_type = 'PRG'
					  start WITH b4.elt_db_id = b1.elt_db_id
					  connect BY prior b4.elt_parent_db_id = b4.elt_db_id )   -- le truc pour récupérer le PRG
GROUP BY b3.elt_db_id,
	  	 b1.pu_db_id, 
	   	 p.proj_id, 
		 b2.orig_pu_db_id, 
	   	 b1.elt_db_id
ORDER BY prog,proj,act

Comme vous pouvez le voir j'accède 4 fois à la table bi_wbs
__________________
"If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/
in est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h20.


 
 
 
 
Partenaires

Hébergement Web