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 :

Fonction récursive qui retourne une table


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut 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.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    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 éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut
    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

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    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 éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut
    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 ^^

Discussions similaires

  1. Une table qui retourne une table
    Par meagain dans le forum SQL
    Réponses: 1
    Dernier message: 22/11/2015, 20h28
  2. Réponses: 8
    Dernier message: 28/10/2015, 11h37
  3. [2008R2] Fonction qui retourne une table sur Excel
    Par VITALTH dans le forum Développement
    Réponses: 0
    Dernier message: 06/02/2015, 10h34
  4. Fonction qui retourne une table
    Par king_simo dans le forum Développement
    Réponses: 4
    Dernier message: 06/02/2015, 00h34
  5. [2008] Probleme fonction qui retourne une table
    Par karimot dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/12/2013, 11h19

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