OVH Cloud OVH Cloud

Sql hiérarchique

3 réponses
Avatar
Gilles
Bonjour,

Je voudrais r=E9cup=E9rer via une requ=EAte sql ( server 2000 )=20
l'ensemble des personnes qui sont sous les ordres d'une=20
autre. Pour cela, j'ai une table personne dans laquelle=20
j'ai trois colonnes :
code
nom
code_pere
La colonne code_pere contient le code du superieur direct.=20
Bien s=FBr, je veux toute l'arborescence et non pas la=20
personne directement inf=E9rieure.

Merci

3 réponses

Avatar
Michel Walsh
Salut,


utiliser une technologie d'ensembles imbriqués (
http://www.dbmsmag.com/9603d06.html ) si l'arborescence ne change pas trop
souvent. Si il y a un faible niveau (profondeur), on peut faire une jointure
répétée:

FROM ((myTable As level0
LEFT JOIN myTable As level1 ON level0.code=level1.code_pere)
LEFT JOIN myTable As level2 ON level1.code=level2.code_pere)
LEFT JOIN myTable As level3 ON level2.code=level3.code_pere

et ainsi de suite...


espérant être utile,
Vanderghast, Access MVP


"Gilles" wrote in message
news:03ec01c3fabf$88a81440$
Bonjour,

Je voudrais récupérer via une requête sql ( server 2000 )
l'ensemble des personnes qui sont sous les ordres d'une
autre. Pour cela, j'ai une table personne dans laquelle
j'ai trois colonnes :
code
nom
code_pere
La colonne code_pere contient le code du superieur direct.
Bien sûr, je veux toute l'arborescence et non pas la
personne directement inférieure.

Merci
Avatar
Christophe KERHOUSSE
Salut,

Voici un exemple de fonction récursive qui s'applique à la table employees
de la base Northwind.
Tu la transposeras facilement pour ta table.
Pour l'appeler : select * from dbo.subordonnes (2)
Cela te donnera tous les id des gens qui dépendent de 2 et des gens qui
dépendent des gens qui dépendent de 2......
Bref, tous les gens en dessous de 2 par récursivité...
Attention, SQLserver limite le niveau d'imbrication de la récursivité à 16
=> pas plus de 16 niveaux hiérarchiques. Ca devrait suffire, non ?

CREATE FUNCTION subordonnes (@InEmployeeID char(5))

RETURNS @reports TABLE

(EmployeeID char(5) PRIMARY KEY)

AS

BEGIN

DECLARE @nombre_subordonnes int

declare @var int

select @nombre_subordonnes = (select count(*) from employees where
reportsto=@InEmployeeID)

if @nombre_subordonnes >0

begin

DECLARE cur CURSOR FOR SELECT EmployeeID FROM employees WHERE reportsTo
@InemployeeID

OPEN Cur

fetch next from cur into @var

while (@@fetch_status <> -1)

begin

INSERT INTO @reports VALUES(@var)

INSERT INTO @reports SELECT EmployeeID FROM

employees WHERE reportsTo in (select * from subordonnes(@var))

fetch next from cur into @var

end

deallocate cur

--

end

RETURN



"Gilles" a écrit dans le message de
news:03ec01c3fabf$88a81440$
Bonjour,

Je voudrais récupérer via une requête sql ( server 2000 )
l'ensemble des personnes qui sont sous les ordres d'une
autre. Pour cela, j'ai une table personne dans laquelle
j'ai trois colonnes :
code
nom
code_pere
La colonne code_pere contient le code du superieur direct.
Bien sûr, je veux toute l'arborescence et non pas la
personne directement inférieure.

Merci
Avatar
Gilles
Merci un mix des deux solutions m'a permis de m'en sortir !
-----Message d'origine-----
Salut,


utiliser une technologie d'ensembles imbriqués (
http://www.dbmsmag.com/9603d06.html ) si l'arborescence


ne change pas trop
souvent. Si il y a un faible niveau (profondeur), on peut


faire une jointure
répétée:

FROM ((myTable As level0
LEFT JOIN myTable As level1 ON


level0.code=level1.code_pere)
LEFT JOIN myTable As level2 ON


level1.code=level2.code_pere)
LEFT JOIN myTable As level3 ON


level2.code=level3.code_pere

et ainsi de suite...


espérant être utile,
Vanderghast, Access MVP


"Gilles" wrote in


message
news:03ec01c3fabf$88a81440$
Bonjour,

Je voudrais récupérer via une requête sql ( server 2000 )
l'ensemble des personnes qui sont sous les ordres d'une
autre. Pour cela, j'ai une table personne dans laquelle
j'ai trois colonnes :
code
nom
code_pere
La colonne code_pere contient le code du superieur direct.
Bien sûr, je veux toute l'arborescence et non pas la
personne directement inférieure.

Merci


.