IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Problème requête récursive


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut Problème requête récursive
    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 :
    Msg*530, Niveau*16, État*1, Ligne*1
    L'instruction a été terminée. La récursivité maximale 100 a été épuisée avant la fin de l'instruction.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    WITH 
       tree (IdProduitPrincipal, IdGroupeAccessoire, IdProduitAcc)
    	as (
    		select p.IdProduit as IdProduitPrincipal, p.IdGroupeAccessoire, pga.IdProduit as IdProduitAcc
    		from Produit p
    		join GroupeAccessoire ga on ga.IdGroupeAccessoire = p.IdGroupeAccessoire
    		join ProduitGroupeAccessoire pga on pga.IdGroupeAccessoire = ga.IdGroupeAccessoire
    		--where p.IdProduit = 865
     
    		UNION ALL
     
    		select p.IdProduit, p.IdGroupeAccessoire, pga.IdProduit as IdProduitAcc
    		from produit p
    		join GroupeAccessoire ga on ga.IdGroupeAccessoire = p.IdGroupeAccessoire
    		join ProduitGroupeAccessoire pga on pga.IdGroupeAccessoire = ga.IdGroupeAccessoire
    		join tree t on t.IdProduitAcc = p.IdProduit 
    	)
     
    	select * from tree
    	order by IdProduitPrincipal
    	--OPTION (MAXRECURSION 100)
    ;
    Par contre si j'enlève le commentaire (where p.IdProduit = 865) pour un IdProduit donné, cette requête fonctionne.

    Que dois je faire, je ne comprends pas l'erreur !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Décommentez aussi l'instruction OPTION (MAXRECURSION) et mettez plus que 100 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPTION (MAXRECURSION 10000)

  3. #3
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    n'avez vous pas une référence circulaire dans vos données?

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut
    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 !

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    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...

  6. #6
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut
    Ok c'est surement le cas ...

    Mais comment je teste ça ?
    J'ai 8000 Produit ?! je ne peux pas faire ça un par un !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2005] Problème type de données dans requête récursive
    Par patlepirate dans le forum Développement
    Réponses: 16
    Dernier message: 04/04/2014, 16h16
  2. Problème de requête récursive
    Par AciDation dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/01/2007, 16h15
  3. Problème de requête récursive sous Oracle 10
    Par boulgom12 dans le forum Oracle
    Réponses: 1
    Dernier message: 13/12/2006, 10h54
  4. [SQL Server]Problème avec une requête récursive
    Par evans dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/04/2006, 21h16
  5. Réponses: 8
    Dernier message: 23/10/2003, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo