Complement a la Presentation de Jean-Claude Riviere - Donnees recursives en SQL
# 0000000851
ajouté le 22/04/2013 12:06:26 et modifié le 22/04/2013
consulté 8133 fois
Niveau
débutant
Version(s) Foxpro : VFP 9.0
Le téléchargement des pièces jointes est limité aux membres Veuillez vous identifier ou vous inscrire si vous n'avez pas encore de compte ...
Description
Jean-Claude nous a parle des donnees recursives et la facon de les requeter
Je viens de plonger dedans - un petit resume
Code source :
&& Code en FoxPro - mode iteratif - pour Jean
createcursor People ;
( p_id I, ;
p_name c(32), ;
p_parent_id I null ;
) indexon p_id tagid insertinto People (p_id, p_name, p_parent_id) values (1, 'Jean', null) for i = 2 to 4 name = 'Jean_' + padl(m.i-1, 2, '0')
insertinto People (p_id, p_name, p_parent_id) values (m.i, m.name, 1)
for j = 1 to 3
name2 = m.name + '_' +padl(m.j, 2, '0') insertinto People (p_id, p_name, p_parent_id) values (m.i*3 + m.j-2, m.name2, m.i) endfor endfor
select p_parent_id asParent, ; cast( 0 asint) asLevel, ;
p_id asId, ;
p_name asname ; from People ; intocursor Result readwrite ; where ( p_parent_id isnull)
dowhile !empty(_Tally) insertinto Result (Parent, Level, Id, name) ; select p_parent_id, ; Level + 1, ;
p_id, ;
p_name ; from People ; join Result on ( Result.Id = People.p_parent_id ) ; wherenotexists ;
( ; select 1 ; from Result ; where( Id = p_id ) ;
)
?_tally
enddo
Commentaires
le 22/04/2013, Jean à Grenoble a écrit : En récursivité, on apprend que chaque procédure récursive peut être écrite en mode itératif. Il faudrait vérifier si cela est aussi vrai en SQL ...
le 22/04/2013, Gregory Adam a écrit : Jean, J'ai ajoute en FoxPro le mode iteratif
le 22/04/2013, Gregory Adam a écrit : Pour Francis -
Reponse a ta question pendant la pause
Quand est-ce que cela s'arrete ?
Reponse : Quand il n'y a plus rien a ajouter - regarde le code en foxpro
le 22/04/2013, Francis Faure a écrit : Gregory, tu sais bien que j'utilise beaucoup la récursivité : mais la lecture du code T-SQL présenté était difficile à voir (pour moi) : où est le point de sortie indispensable à toutes procédures récursives. En version vfp cela est bien lisible. Cordialement Francis
le 27/04/2013, eddymaue a écrit : plus sérieusement je ne comprend pas ou se situe la récursivité....
do while !empty(_Tally) insert into Result (Parent, Level, Id, name) ; select p_parent_id, ; Level + 1, ; p_id, ; p_name ; from People ; join Result on ( Result.Id = People.p_parent_id ) ; where not exists ; ( ; select 1 ; from Result ; where( Id = p_id ) ; ) ?_tally
enddo
je vois une insertion baser sur une jointure inexistante " where not exists....", c'est là que je me dis que ce n'est qu'itératif !
le 28/04/2013, Michel Lévy a écrit : En complément de ce complément, j'ai trouvé http://www.databasejournal.com/features/mssql/unpack-an-integer-with-sql-server-recursion.html une jolie petite étude 100% SQL sur les calculs de factorielles en mode récursif, avec ou sans CTE.
En récursivité, on apprend que chaque procédure récursive peut être écrite en mode itératif. Il faudrait vérifier si cela est aussi vrai en SQL ...