|
Publicité | ||||||||||||||||||||||
|
|
#1 | ||||||||||||||||||||||||
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
Bonjour à tous.
Je viens vers vous concernant un problème de comportement (un bug ?) dans les requêtes hierarchiques sur des données contenant des boucles. Citation:
Soit la table suivante : Code :
Cas 1 Code :
Citation:
Code :
Code :
Cas 2 Code :
Code :
3 C refers D 5 C refers D 4 D refers A 6 D refers A Ces "doublons" s'expliquent par le fait qu'ils n'ont pas lieu dans le même chemin. Le chemin a donc de l'importance. Si on présente la requête en arbre cela se comprend : Code :
Code :
Cas 3 Code :
Code :
Code :
Ceci prouve que la gestion des boucles avec une requête hierarchique n'est pas du tout au point, même en 10g puisqu'on peut perdre des relations (alors que la plupart des cas sont correctement gérés). En conclusion, si je ne trouve pas une méthode pour contourner ce comportement je vais être obligé d'abandonner les requêtes hierarchiques pour faire ma récursivité en code applicatif (toujours pratique quand on utilise un ETL ou un outil de requêtage). Donc si quelqu'un s'est déjà frotté à ce problème, a du temps pour m'aider ou a ses entrées chez Oracle, merci du coup de main.
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
||||||||||||||||||||||||
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 452 ![]() |
Sujet très intéressant.
|
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 892 ![]() |
je suis assez d'accord que D refere C est manquant. A mon sens ça vaut le coup d'ouvrir un bug sur Metalink.
Quant à l'implémentation propre au chemin, c'est bien ça le bug qui fait que CONNECT BY LEVEL<10 fonctionne (à tort ). J'ai ouvert une SR à ce sujet il y a fort longtemps ;-)
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
Salut Laurent. C'est quoi cette histoire de LEVEL < 10 ? Tu peux développer stp ?
Merci
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
|
|
00
|
|
|
#5 | ||||
![]() ![]() |
C'est l'astuce pour générer n lignes à la volée :
Code :
Code :
__________________
Email : http://scr.im/waldar |
||||
|
00
|
|
|
#6 | ||
![]() ![]() |
Pour votre soucis, je ne sais pas si c'est viable dans votre cas pratique mais si vous pouvez vous passez des informations level et connect_by_root vous pouvez obtenir tous les résultats ainsi :
Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
Hmmm disons que cette méthode va me permettre d'avoir toutes les relations, mais pas toutes les relations en partant d'un point donné.
J'utilise déjà cette méthode pour "mettre à plat" toutes mes relations à partir de tous les objets possibles, mais je perds toujours des relations dans certains cas de boucles. PS : ok je connaissais pas l'astuce du DUAL connect by
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 892 ![]() |
Et bien tant mieux
![]() Cette astuce est une perversion du système de hiérarchie et elle a l'avantage et l'inconvénient d'être performante. Mais ce n'est pas une syntaxe légale. En fait, il y a boucle dès que la valeur courante existe dans la liste des "PRIOR" précédentes. Cependant si tu fais CONNECT BY 1=1, tu as une boucle infinie, mais comme tu n'as pas de PRIOR, la boucle n'est pas détectée. Différentes astuces plus ou moins réussies ont permis d'abuser cette technique pour créer des lignes. Il y a bien sûr plein de bugs et ce n'est pas supporté à mon humble avis. Pour revenir à la relation manquante, je vais tenter de faire ouvrir un bug sur Metalink. A+ Laurent PS: bien sûr j'update dès que j'ai le numéro du bug... |
|
00
|
|
|
#9 | ||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 892 ![]() |
j'ai ajouté and prior sys_guid() is not null dans la clause connect by, suite à un commentaire sur mon blog.
Code :
Code :
|
||||
|
00
|
|
|
#10 | ||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 892 ![]() |
mais c'est probablement une mauvaise idée, Oracle risque de boucler infiniment dans certains cas
Code :
Code :
|
||||
|
00
|
|
|
#11 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 892 ![]() |
peut-être que
Code :
|
||
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 892 ![]() |
j'ai écrit un article sur mon blog quant à l'implémentation en 11gR2 des requêtes hiérarchiques
http://laurentschneider.com/wordpres...rsive-cte.html |
|
00
|
Copyright © 2000-2012 - www.developpez.com