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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <anonymous@discussions.microsoft.com> wrote in message
news:03ec01c3fabf$88a81440$a501280a@phx.gbl...
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.
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
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
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" <anonymous@discussions.microsoft.com> a écrit dans le message de
news:03ec01c3fabf$88a81440$a501280a@phx.gbl...
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.
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
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
.
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" <anonymous@discussions.microsoft.com> wrote in
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 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.