|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
Bonjour a tous,
Je me casse la tête sur un problème depuis hier matin et je ne voie pas du tout comment le résoudre. Alors je m'explique : Je dois trouver le chemin unique entre deux tables d'une arborescence de plusieurs dizaines de tables. Ces deux tables pouvant être séparées par plusieurs autre tables. Je n'ai pour information que le nom de ces deux tables (table départ et arrivée), et, j'ai également en base les enregistrements entre chacune des tables de mon arborescences, notées sous la forme suivante : Le modèle que j'ai a la particularité de n'avoir qu'un seul chemin entre deux tables. Je pensait donc me servir des CTE afin de réaliser cette recherche mais n'ayant pas en base de lien père-fils cela ne donne rien. Mon but étant d'avoir a la fin (pas forcément présenté comme cela, c'est pour illustrer) : Code :
TABLE1-TABLEinter1 > TABLEinter1-TABLEinter2 > TABLEinter2-TABLEinter3 > TABLEinter3-TABLE2 edit : J'ai une idée pour faire cela en code, mais cela impliquerai de lancer plusieurs centaines de requêtes au SGBD et de gros traitement code serveur. C'est pour cela que je souhaiterai le faire a partir du SQL directement. Quelqu'un aurait il une idée pour m'orienter. Merci d'avance Ghosty |
|
|
00
|
|
|
#2 |
![]() ![]() |
Il semblerait que vous confondiez plusieurs notions ici.
Une hiérarchie c'est une relation père-fils enregistrée dans la même table, qui pointe donc sur elle-même. On les interroge avec l'opérateur historique CONNECT BY ou plus récemment depuis 11gR2 avec les CTE récursives. Maintenant ce que vous avez l'air de rechercher ce sont les associations naturelles de vos tables. Là il faudrait vous référer à un MCD, mais j'imagine que vous n'en avez pas ! Difficile de vous aider plus, car malheureusement nous ne possédons ni vos tables ni vos données. Si j'ai mal cerné votre problème n'hésitez pas à en dire plus.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
Bonjour waldar,
Je ne pense pas que tu ais mal compris, c'a doit plustot etre moi qui me suis mal exprimé... Enfin bon, effectivement je n'ai pas de mcd a proprement dit car ce que je dois réaliser devra pouvoir s'adapter a plusieurs modèle ne comprenant jamais les même tables. Je met en pièce jointe un exemple de shema que j'ai a parcourir pour exemple. Ce shema est une simple représentation graphique. Moi j'ai a ma disposition : table1 : SVT-CCLI table2 : SVT-HCS En base je vais avoir les éléments suivant : 1 : SVT-CCLI-SVT-CLI;relation 2 : SVT-CLI-SVT-DET;relation 3 : SVT-DET-SVT-HCS: relation 4.... 5.... ainsi de suite, pour toutes les relations entre chaque table. Du coup moi a partir de mes deux tables j'aimerai récupérer mes 3 relations (pour l'exemple ci dessus) en passant par le SQL. Es-ce que c'est plus clair ?? |
|
|
00
|
|
|
#4 | ||
|
Membre éprouvé
![]() |
Bonjour,
Je partirai sur l'approche suivante : - transforme le champ de relation "TABLE1-TABLE2;RELATION" pour en sortir 2 champs TABLE_PERE ("TABLE1") et TABLE_FILLE ("TABLE2") avec des SUBSTR et INSTR, - sur cette vue implicite, faire une requête hiérarchique pour établir l'arborescence des dépendances, - filtrer sur le point de départ et d'arrivée A la fin, la requête devrait ressembler à quelque chose du style : Code :
|
||
|
|
10
|
|
|
#5 |
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
bonjour et merci xdescamp
Je vais essayer de tester cela. Mais toutes mes bases n'étant pas en 11gr2, est il possible de faire la même chose avec START WITH ..... CONNECT BY ??? |
|
|
00
|
|
|
#6 |
|
Membre éprouvé
![]() |
|
|
|
00
|
|
|
#7 |
![]() ![]() |
CONNECT BY est disponible depuis la v2 !
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#8 | ||
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
ok merci pour les info je regarderai ca plus tard.
Je viens de tester la requete proposé par xdescamp et elle me retourne dans tous les cas 0 résultats... J'ai pris pour test un exemple avec seulement 1 table a trouver entre les deux Je pense que ca viens (pas certain du tout) de : Code :
connect BY prior table_fille = table_pere Qu'en pensez vous? La requête exécutée : Code :
EDIT : J'ai tester la partie avec les substr et cela me retourne toutes les jointures avec la table père et fille découpée correctement. EDIT 2 : En fait je suis sur un base en 10.2. le souci viendrait il de la? pourtant la requête s'exécute sans erreur... EDIT 3 : J'ai également oublier de vous dire que les enregistrements de la base ne respecte pas forcément la règle PERE/FILLE dans le nommage. Il y en a également qui sont de type FILLE/PERE. J'ai donc rajouter au START WITH : Code :
START WITH table_pere = 'SVT-CVF' OR table_fille = 'SVT-CVF' Code :
WHERE table_fille = 'SVT-REM' OR table_pere = 'SVT-REM' |
||
|
|
00
|
|
|
#9 |
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
Salut les gars,
alors personne n'a une petite idée?? C'est peu être pas possible... |
|
|
00
|
|
|
#10 |
![]() ![]() |
Personnellement, je n'ai toujours pas compris le problème.
Peut-être avec un jeu de test initial et ce que vous en attendez ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#11 | ||
|
Membre éprouvé
![]() |
Si le contenu de la table GWSQL n'est pas normalisé, ça ne peut pas fonctionner.
Essayez de repartir de ma requête de départ, mais en remplaçant la vue "liens" par le code suivant pour gérer toutes les combinatoires : Code :
Mais pour pouvoir vraiment vous aider, il nous faudrait un extrait significatif de la table GWSQL et plusieurs cas de test et de résultat attendu. |
||
|
|
10
|
|
|
#12 | ||
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
Ok pas de souci, je vais essayer de ré-expliquer avec toutes les info.
voila une extraction des informations que j'ai en base concernant une architecture (semblable a l'image jointe plus haut). On retrouve dans cette extraction les liens entre les différentes tables. Code :
IDENTIFIANT;DESCRIPTION;RELATION A partir de cela je voudrais récupérer (par une requête SQL) le chemin entre SVFAV et SGART A savoir : Code :
J-SVCDV-SVFAV > J-SVCDV-SVLCV > J-SGART-SVLCV et un exemple simple (même si celui la j'arrive a le récupérer par une requete simple), SVCDV et SVETC Cela me permettra ensuite de générer la partie WHERE d'une requête SQL, donc l'ordre de récupération n'a pas d'importance. Si tu veux d'autre explications n'hésite pas? |
||
|
|
00
|
|
|
#13 | ||
|
Membre éprouvé
![]() |
Comme prévu, ce n'est pas performant, mais voici une requête qui fonctionne :
Code :
|
||
|
|
10
|
|
|
#14 | ||
![]() ![]() |
J'ai une solution relativement similaire :
Code :
__________________
Email : http://scr.im/waldar |
||
|
10
|
|
|
#15 |
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
Pouahllalala les gars, franchement c'est ouf je m'attendais pas à un truc comme ca.
Mais ca marche, respect. ![]() Par contre j'aimerai bien comprendre... Alors déja la première partie ou vous reprenais toute la table (c'est crazy), mais c'est quoi le but on peut pas se servir de la table en elle meme directement? et les "FROM dual UNION ALL" ca sert a quoi (edit : en fait c'est le "dual" que je comprend pas trop, il sort d'où)? sinon quelque chose m'intrigue encore plus c'est que la requete de Waldar s'exécute instantanément alors que celle de xdescamp mais un temps considérable. Pourtant je ne vois pas de différence flagrante (edit : pour moi ca viendrai du Connect by, mais pourquoi... ). |
|
|
00
|
|
|
#16 | |
|
Membre éprouvé
![]() |
Citation:
Il faudrait comparer les plans d'exécution. la différence vient peut-être de l'endroit où est fait le filtre sur la table finale. |
|
|
|
00
|
|
|
#17 |
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
d'accord je commence a comprendre la première partie donc j'ai pas besoin de faire un bout de programme pour générer ca, il suffit que je remplace les FROM par ma table a moi et que j'y ajoute mes filtres. enfin si j'ai bien compris.
Sinon pour ce qui est de l'exécution, j'ai simplement copier vos requêtes et je les exécutes tel quelle, je n'ai ajouter aucun filtre. La je n'ai pas accès au plan d'exécution mais je vous récupère ca demain matin. |
|
|
00
|
|
|
#18 |
![]() ![]() |
À mon avis il suffit de mettre en commentaire ceci :
Vu qu'il y a déjà un NOCYCLE qui empêche les boucles, je pense qu'il vaut mieux conserver le critère récursif le plus simple possible.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#19 |
|
Futur Membre du Club
![]() Inscription : juin 2007 Messages : 69 ![]() |
Effectivement je viens de remplacer la partie haute de la requête de Waldar et j'ai remplacer les valeurs suivantes par celle de ma base et ca marche au poil.
J'ai fait la même chose avec celle de xdescamp et j'ai également enlever ce qu'a dit Waldar et la requête s'exécute instantanément aussi. Résultat requête Waldar : Code :
J-SGART-SVLCV -> J-SVCDV-SVLCV -> J-SVCDV-SVFAV Code :
> J-SVCDV-SVFAV > J-SVCDV-SVLCV > J-SGART-SVLCV Je pourrais récupérer les plans d'exécution demain matin si ca vous intéresse. Sinon je garderai la requête de Waldar. Dans tous les cas un grand merci a vous deux. |
|
|
00
|
|
|
#20 |
![]() ![]() |
Vu la structure de votre table, c'est la même chose que faire de A --> B --> C ou C --> B --> A.
Sinon il ne faut pas remplacer la première partie par vos valeurs, vous les avez déjà dans votre table, il suffit de commencer la deuxième étape.
__________________
Email : http://scr.im/waldar |
|
00
|
Copyright © 2000-2012 - www.developpez.com