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

Développement SQL Server Discussion :

[SQL2K5]les requête recursives [Fait]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Par défaut [SQL2K5]les requête recursives
    Bonjour à tous,
    Suite à la lecture, d'un post, j'ai voulu m'essayer à la rêquete récursive pour récupérer des infos.

    J'ai bien lu le tuto mais je n'arrive pas à appliquer.

    J'ai une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T_DIM_GRANDES_COMPTES (GrandesComptes_Id, EntiteClienteMere_Id, EntiteClienteFille_Id)
    et voici mon essai de la requête récursive
    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
    23
    24
    25
    26
    27
    28
    WITH 
       tree (EntiteClienteMere_Id, level, EntiteClienteFille_Id, GrandesComptes_Id, pathstr)
       AS (SELECT 
    			EntiteClienteMere_Id
    			, 0
    			, EntiteClienteFille_Id
    			, GrandesComptes_Id
    			, CAST('' AS VARCHAR(MAX)) 
    		FROM   T_DIM_GRANDES_COMPTES
    		WHERE  EntiteClienteMere_Id = 110532 --248372
    		UNION ALL
    		SELECT 
    			V.EntiteClienteMere_Id
    			, t.level + 1
    			, V.EntiteClienteFille_Id
    			, V.GrandesComptes_Id
    			, t.pathstr + CAST(V.EntiteClienteMere_Id AS VARCHAR(MAX))
    		FROM   T_DIM_GRANDES_COMPTES V
                  INNER JOIN tree t
                        ON t.EntiteClienteFille_Id= V.EntiteClienteMere_Id )
    SELECT 
    	SPACE(level) + EntiteClienteMere_Id AS EntiteClienteMere_Id
    	, level
    	, EntiteClienteFille_Id
    	, GrandesComptes_Id
    	, pathstr
    FROM   tree
    ORDER  BY pathstr, EntiteClienteMere_Id
    Si j'utilise un EntiteClienteMere_Id qui n'a que des filles et pas de petites-filles, la requête me retourne bien les filles avec un level = 0

    Par contre si j'execute avec un EntiteClienteMere_Id ayant des petites-filles je me retrouve avec l'erreur suivante :
    "The statement terminated. The maximum recursion 100 has been exhausted before statement completion."


    Or j'ai vérifié avec des requêtes toute simple que la récursion est bonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DROP TABLE #tmpGC1
    SELECT GrandesComptes_Id, EntiteClienteMere_Id, EntiteClienteFille_Id
    into #tmpGC1
    FROM   T_DIM_GRANDES_COMPTES
    WHERE  EntiteClienteMere_Id = 110532 --248372
     
    select *  from T_DIM_GRANDES_COMPTES
    where EntiteClienteMere_Id in (select EntiteClienteFille_Id from #tmpGC1)
    	 AND GrandesComptes_Id not in (select GrandesComptes_Id from #tmpGC1)
     
    select *  from T_DIM_GRANDES_COMPTES
    where EntiteClienteMere_Id in (select EntiteClienteFille_Id from #tmpGC2)
    	 AND GrandesComptes_Id not in (select GrandesComptes_Id from #tmpGC2)
    Dans le cas de mon EntiteClienteMere_Id, la dernière requêtes ne retourne rien, le nombre de niveau n'est pas donc infini.

    Merci à vous pour vos éclaircissements.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Par défaut
    je n'ai pas beaucoup de temps pour regarder mais pour depasser 100 recursion, il faut mettre une option.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH CTETemps AS  
      (  
      SELECT cast('1990-01-01' AS datetime) Date  
      UNION ALL  
      SELECT Date + 1  
      FROM CTETemps  
      WHERE Date + 1 < '2031-01-01'  
      )  
    SELECT top 10 * FROM CTETEMPS ORDER BY Date desc OPTION (MAXRECURSION 0);
    pour en savoir plus : http://blog.developpez.com/index.php...ation_de_table

  3. #3
    Membre Expert Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Par défaut
    Le truc est que j'ai maximum 3 niveau dans mes Entites.
    C'est pour cela que je cherche le problème dans ma requête récursive.

    Merci.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Par défaut
    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
    23
    24
    25
    26
    27
    28
    29
    WITH 
    tree (EntiteClienteMere_Id,level, EntiteClienteFille_Id, GrandesComptes_Id, pathstr)
    AS(SELECT 
    EntiteClienteMere_Id
    , 0
    , EntiteClienteFille_Id
    , GrandesComptes_Id
    ,CAST('' AS VARCHAR(MAX)) FROM T_DIM_GRANDES_COMPTES
    WHERE EntiteClientefille_Id isnull
    UNION ALL
    SELECT 
    V.EntiteClienteMere_Id
    , t.level + 1
    , V.EntiteClienteFille_Id
    , V.GrandesComptes_Id
    , t.pathstr +CAST(V.EntiteClienteMere_Id ASVARCHAR(MAX)) 
     FROM T_DIM_GRANDES_COMPTES V
    INNER JOIN tree t
    ON t.EntiteClienteMere_Id= V.GrandesComptes_Id )
    SELECT 
    EntiteClienteMere_Id AS EntiteClienteMere_Id
    ,level
    , EntiteClienteFille_Id
    , GrandesComptes_Id
    , pathstr
    FROM tree
    ORDER  BY level,pathstr, EntiteClienteMere_Id
    

  5. #5
    Membre Expert Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Par défaut
    Bonjour, Merci pour l'idée mais cela ne fonctionne pas.
    J'ai oublier une explication.

    Cette table Grandes_Comptes n'est qu'un table de référence entre EntiteFille_Id et Mere_Id.
    ces Id se retrouvent dans une autre table EntiteCliente dont j'aurais ensuite besoin de récupérer des infos.
    Le GrandesComptes_Id ne sert strictement à rien, je l'affichais juste pour avoir quelque chose à mettre.
    De plus, tu ne spécifiais plus nul part l'IdMere de laquelle partir.

    J'ai donc essayer le modifier ton script de la manière suivante :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    WITH 
    tree (EntiteClienteMere_Id,level, EntiteClienteFille_Id, pathstr)
    AS(SELECT 
    	EntiteClienteMere_Id
    	, 0
    	, EntiteClienteFille_Id
    	,CAST('' AS VARCHAR(MAX)) 
    	FROM T_DIM_GRANDES_COMPTES
    	WHERE  EntiteClienteMere_Id = 110532
    UNION ALL
    	SELECT 
    	V.EntiteClienteMere_Id
    	, t.level + 1
    	, V.EntiteClienteFille_Id
    	, t.pathstr +CAST(V.EntiteClienteMere_Id AS VARCHAR(MAX)) 
    	 FROM T_DIM_GRANDES_COMPTES V
     
    INNER JOIN tree t
    	ON V.EntiteClienteMere_Id= t.EntiteClienteFille_Id
     
    	WHERE t.EntiteClienteFille_Id IS NULL
     )
    SELECT 
    	EntiteClienteMere_Id AS EntiteClienteMere_Id
    	,level
    	, EntiteClienteFille_Id
    	, pathstr
    FROM tree
    ORDER  BY level,pathstr, EntiteClienteMere_Id
     
     
    SELECT * FROM T_DIM_GRANDES_COMPTES
    .

    Le premier SELECT retourne bien les filles de l'EntiteClienteMere_Id donné dans le where, mais ensuite je n'ai pas de récursivité.

    Merci pour ton aide.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Par défaut
    Le script que je t'ai fourni fonctionne pour une table

    T_DIM_GRANDES_COMPTES (GrandesComptes_Id, EntiteClienteMere_Id, EntiteClienteFille_Id)

    avec les données suivantes

    (1,2,null)
    (2,3,1)
    (3,null,2)
    (4,null,null)
    (5,6,null)
    (6,null,5)

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

Discussions similaires

  1. Intercepter les requêtes HTTP et les modifier.
    Par Alexandre T dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 21/09/2005, 19h25
  2. Accents non pris en compte dans les requêtes SELECT
    Par YanK dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/08/2005, 10h57
  3. Réponses: 5
    Dernier message: 16/08/2005, 12h15
  4. Réponses: 44
    Dernier message: 14/03/2005, 09h43
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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