|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Bonjour,
j'ai un soucis de requête récursive. Voici ce que je cherche à faire : Récupérer tous les accessoires, sous-accessoires ... des produits Voici mes tables : Produit (IdProduit, IdGroupeAccessoire) GroupeAccessoire (IdGroupeAccessoire) ProduitGroupeAccessoire(IdProduitGroupeAccessoire, IdProduit, IdGroupeAccessoire) En gros un produit à un groupe d'accessoires qui sont également des produits, et ces produits peuvent également avoir des groupes d'accessoires et ainsi de suite ... Voici mon message d'erreur : Citation:
Code :
Que dois je faire, je ne comprends pas l'erreur ! |
|||
|
|
00
|
|
|
#2 |
![]() ![]() |
Décommentez aussi l'instruction OPTION (MAXRECURSION) et mettez plus que 100 :
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 |
|
Membre Expert
![]() |
n'avez vous pas une référence circulaire dans vos données?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Bonjour,
Même avec OPTION (MAXRECURSION ) (sans limite) ma requête n'aboutit pas ! Qu'appelez vous référence circulaire ? Dans ma table de Produit j'ai bien une référence ProduitSubstitution qui pointe vers un Produit, donc effectivement j'ai bien une liaison qui boucle sur ma table mais je n'appelle pas cette propriété dans ma requête ! |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() |
Certes mais vous extrayez un idproduit de ProduitGroupeAccessoire puis vous faites votre récursion dessus... (join sur tree dans le union all)
A mon humble avis cela crée une récursion sans fin du fait d'une référence circulaire (un idproduitAcc prends la valeur d'un idproduitPrincipal déjà traité cela ne devrait jamais arriver...) Amusez vous à tester la récursion un par un en insérant dans une table par exemple vous trouverez la données incriminée...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Ok c'est surement le cas ...
Mais comment je teste ça ? J'ai 8000 Produit ?! je ne peux pas faire ça un par un ! |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Ben tu procèdes par dichotomie :
http://fr.wikipedia.org/wiki/Dichotomie En gros : Tu prends les 4000 premiers produits. => Si ça plante, tu prends les 2000 premiers. => Si ça plante pas, tu prends les 2000 à 3000. => Si ça plante, tu prends les 2000 à 2500 Etc. Jusqu'à ce que tu trouves ton produits qui merde En gros, tu reprends le jeu de Pierre et de Paul : quand ça plante, c'est que ton produit bloquant est dans l'interval testé, donc que Paul à dit "oui" PS : A noter qu'il n'est pas exclu que tu aies plusieurs références circulaires, si c'est le cas, il faudra reprendre à 0 tant qu'il restera des produits bancals... Sacré farceur de Paul |
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Ok mais où est Jacques ...
Au final j'ai trouvé la solution ! En cherchant un peu dans votre direction, j'avais bien un problème de données circulaire, car je faisais le test sur tous les produits ! En ajoutant des clauses, j'ai mieux ciblé ma récursivité et du coup ça marche ! Merci pour vos réponses qui ont permis de m'orienter vers la lumière !
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com