OVH Cloud OVH Cloud

Script SQL : récursivité jusqu'au 4eme degrés

4 réponses
Avatar
Sylvain
Bonjour à tous,

J'ai déjà du poser ce type de question, sans réponse.. je n'y arrive
VRAIMENT PAS et je perds tout mon tps ..

J'ai une table CONTACT qui représente les personnes inscrites sur le site :
-> CONTACT = con_id, nom
-> exemple : 1 Sylvain
2 Florent
3 Philippe
4 Elisabeth
5 Antoine

J'ai une table NETWORK qui représente les relations entre personnes
incrites sur le site ('net_con_id' en relation avec 'contact') :
-> NETWORK = net_id, net_con_id, contact
-> exemple : 1 1 2
2 2 1
3 1 3
4 3 1
5 2 3
6 3 2
7 2 4
8 4 2
9 4 1
10 1 4
11 4 5
12 5 4
13 5 1
14 1 5


J'ai une table STATISTICS qui représente les stats du site des
utilisateurs (nb de contacts du 1er au 4eme degrés) :
-> STATISTICS = sta_id, sta_con_id, degree1, degree2, degree3, degree4

Degree 1 correspond au nombre de contacts de l'utilisateur, soit le
nombre de personne en relation direct avec lui.
Degree 2 correspond au nombre de contacts des contacts de l'utilisateur,
soit le nombre de personne en relation direct avec ces relations directes.
Degree 3 correspond au nombre de contacts des contacts des contacts de
l'utilisateur, soit le nombre de personne en relation avec les relations
de ces relations directs.
Degree 4 : je vous laisse imaginer...

ATTENTION : il faut penser à ne pas me compter à chaque fois (pour les
contacts de second degrès par exemple).


MON BUT avec VOTRE AIDE :
Je veux remplir la table STATISTICS avec un batch dans les deux cas
suivants :
- lancement du batch -> suppression de la table si elle existe + la
creer en relation avec les résultats de la table NETWORK
- mettre à jour la table lorsqu'une personne se met en relation avec
une autre (beaucoup de redondances...)



Merci pour votre aide et 'déblocage' ...

++

4 réponses

Avatar
Sylvain
Antoun a écrit :
Sylvain wrote:

Bonjour à tous,

J'ai déjà du poser ce type de question, sans réponse.. je n'y arrive




je t'ai donné une réponse le 8 novembre... je t'invite donc à me dire si
elle te convient ou pas, et si elle ne te va pas où est le problème...

http://groups.google.fr/group/fr.comp.applications.sgbd/browse_frm/thread/a8ae7f29a7696b3e/3016f0ef2ca50511?tvc=1&q=sylvain#3016f0ef2ca50511




Ta requête me sort des résultats erronés, je n'ai pas réussi à l'adapter
et je n'ai pas trouvé l'erreur.

De plus, comment dois-je faire pour mettre à jour ma table sans la
supprimer et la recréer ?
Avatar
Sylvain
Frédéric BROUARD a écrit :
Utiliez une représentation intervallaire de votre arborescence. Ainsi vous
n'aurez plus de récursivité à gérer et pourrez gérer des niveau à
l'infini avec
un une performance linéaire.
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/arborescence/

Sinon, si votre SGBDR supporte les CTE et les requêtes récursives, lisez
l'article que j'ai écrit (en anglais) sur le sujet :
http://www.sqlservercentral.com/columnists/fBROUARD/recursivequeriesinsql1999andsqlserver2005.asp


A +

Sylvain a écrit:

Bonjour à tous,

J'ai déjà du poser ce type de question, sans réponse.. je n'y arrive
VRAIMENT PAS et je perds tout mon tps ..

J'ai une table CONTACT qui représente les personnes inscrites sur le
site :
-> CONTACT = con_id, nom
-> exemple : 1 Sylvain
2 Florent
3 Philippe
4 Elisabeth
5 Antoine

J'ai une table NETWORK qui représente les relations entre personnes
incrites sur le site ('net_con_id' en relation avec 'contact') :
-> NETWORK = net_id, net_con_id, contact
-> exemple : 1 1 2
2 2 1
3 1 3
4 3 1
5 2 3
6 3 2
7 2 4
8 4 2
9 4 1
10 1 4
11 4 5
12 5 4
13 5 1
14 1 5


J'ai une table STATISTICS qui représente les stats du site des
utilisateurs (nb de contacts du 1er au 4eme degrés) :
-> STATISTICS = sta_id, sta_con_id, degree1, degree2, degree3, degree4

Degree 1 correspond au nombre de contacts de l'utilisateur, soit le
nombre de personne en relation direct avec lui.
Degree 2 correspond au nombre de contacts des contacts de
l'utilisateur, soit le nombre de personne en relation direct avec ces
relations directes.
Degree 3 correspond au nombre de contacts des contacts des contacts de
l'utilisateur, soit le nombre de personne en relation avec les
relations de ces relations directs.
Degree 4 : je vous laisse imaginer...

ATTENTION : il faut penser à ne pas me compter à chaque fois (pour les
contacts de second degrès par exemple).


MON BUT avec VOTRE AIDE :
Je veux remplir la table STATISTICS avec un batch dans les deux cas
suivants :
- lancement du batch -> suppression de la table si elle existe + la
creer en relation avec les résultats de la table NETWORK
- mettre à jour la table lorsqu'une personne se met en relation avec
une autre (beaucoup de redondances...)



Merci pour votre aide et 'déblocage' ...

++







Je suis désolai d'insister mais non, ce n'est pas une représentations
intervalaire puisqu'une personne peut être mis en relation avec
plusieurs autres, elles mêmes en relation avec d'autres...
Avatar
Fred Brouard - SQLpro
Sylvain a écrit:


Je suis désolai d'insister mais non, ce n'est pas une représentations
intervalaire puisqu'une personne peut être mis en relation avec
plusieurs autres, elles mêmes en relation avec d'autres...



alors si c'est un graphe essayez les CTE.

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Antoun
Sylvain wrote:
Antoun a écrit :

Sylvain wrote:

Bonjour à tous,

J'ai déjà du poser ce type de question, sans réponse.. je n'y arrive





je t'ai donné une réponse le 8 novembre... je t'invite donc à me dire
si elle te convient ou pas, et si elle ne te va pas où est le problème...

http://groups.google.fr/group/fr.comp.applications.sgbd/browse_frm/thread/a8ae7f29a7696b3e/3016f0ef2ca50511?tvc=1&q=sylvain#3016f0ef2ca50511





Ta requête me sort des résultats erronés, je n'ai pas réussi à l'adapter
et je n'ai pas trouvé l'erreur.



si tu veux que je puisse t'aider, dis-moi ce que ça te donne comme
résultat et quel résultat tu attendais

De plus, comment dois-je faire pour mettre à jour ma table sans la
supprimer et la recréer ?



- soit tu la vides et tu la re-remplis intégralement
TRUNCATE TABLE machin ;
INSERT INTO machin
SELECT ...

- soit tu raisonnes en mise à jour au fur et à mesure, mais dans ce cas
il faudra bien identifier les différents événements devant déclencher
une màj établir les requêtes correspondantes