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 :

Fonction récursive qui retourne une table


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Fonction récursive qui retourne une table
    Bonjour à tous,
    j'ai besoin de faire une requête récursive de parcours de graphe orienté, avec collecte de la pondération des liens.
    Je ne sais pas si cela touche de près ou de loin à la notion de CTE que j'ai du mal à capter, mais je sollicite votre aide.
    Disons que j'ai une table LIENS (lien_pere, lien_fils, lien_coût), un fils peut avoir plusieurs pères, et un père plusieurs fils, mais pas de réflexivité possible (cela représente les cas d'emplois de composants dans des produits).

    Pour un périmètre de noeuds donné, j'ai besoin de collecter chaque top parent, avec le coût de parcours que cela représente (dans mon cas je devrai multiplié les coûts entre eux, et pas les additionner).

    Pour l'instant je sort qqchose qui n'est pas satisfaisant car je cumule dans une chaine tous les top parents d'un noeud donné, il faudrait queje retraite ce flot de données en faisant des split, etc... pour éclater en autant de lignes... ce qui fait qu'en ce moment j'ai qqchose de la forme :

    noeud_1 "(top_père_1, 0.1234) , (top_père_2, 0.4567)"
    noeud_2 "(top_père_2, 1.5), (top_père_5, 2), (top_père_n, cout)"
    ...
    noeud_n "(top_père_1, 1.456), ... , (top_père_n, cout)"

    Peut-être que cela passe par une table temporaire, mais il faudrait qu'elle soit globale à ma fonction récursive...

    Merci d'avance pour votre aiguillage.
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  2. #2
    Modérateur

    bonjour,

    Pourquoi ne pas faire le calcul dans la requête récursive, au fur et à mesure des récursions ?

    un jeu d'essai avec résultat attendu aiderait beaucoup pour mieux comprendre le problème et donc... mieux y répondre !

  3. #3
    Membre averti
    Ma difficulté est de faire que les appels récursifs retournent la table finale.

    Exemple:


    PERE FILS LIEN
    D B 1
    E C 0.5
    C A 0.2
    F C 1

    Ma routine doit me retourner

    REF TOPREF LIEN PONDERE
    A E 0.1
    A F 0.2
    B D 1
    C E 0.5
    C F 1
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  4. #4
    Modérateur

    du coup, quelque chose comme ça :

    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
     
    WITH LaTable(PERE ,	FILS ,	LIEN) AS (
     
    		  SELECT  'D','B', 	1
    UNION ALL SELECT  'E','C', 	0.5
    UNION ALL SELECT  'C','A', 	0.2
    UNION ALL SELECT  'F','C', 	1
    ),
    Rec AS (
     
    		SELECT	Fils AS REF, fils, Pere, CAST(LIEN AS DECIMAL(10,5)) AS LIEN
    		FROM	LaTable
     
    		UNION ALL 
     
    		SELECT  F.REF, P.FILS, P.PERE, CAST(F.LIEN * P.LIEN AS DECIMAL(10,5))
    		FROM	Rec AS F
    		INNER JOIN LaTable AS P
    			ON P.FILS = F.PERE
    )
    SELECT F.REF, F.PERE AS TOPREF, F.LIEN AS LIEN_PONDERE
    FROM rec AS F
    LEFT JOIN LaTable P
    	ON P.FILS = F.PERE
    WHERE P.FILS IS NULL

  5. #5
    Membre averti
    Oui ça donne le résultat escompté, mais alors faut que je comprenne la logique, et je manque clairement de matière. Je vais essayer de transposer ta requête sur ma base de données. En attendant, merci beaucoup, mais je pense qu'on va se revoir ^^
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

###raw>template_hook.ano_emploi###