web-dev-qa-db-fra.com

Obtenez tous les parents pour un enfant

Je veux récupérer le parentid d'un identifiant, si ce parentid a un parent à nouveau le récupérer, et ainsi de suite. Type de table de hiérarchie.

id----parentid
1-----1
5-----1
47894--5
47897--47894

suis nouveau sur le serveur sql et ai essayé, quelques requêtes comme:

with name_tree as 
(
   select id, parentid
   from Users
   where id = 47897 -- this is the starting point you want in your recursion
   union all
   select c.id, c.parentid
   from users c
   join name_tree p on p.id = c.parentid  -- this is the recursion
) 
select *
from name_tree;

Cela ne me donne qu'une seule ligne. et je veux également insérer ces enregistrements dans une variable de table temporaire. Comment puis-je faire ceci. Merci d'avance. désolé d'avoir posé la question simple (mais pas à moi)

21
srinioracle

Essayez ceci pour obtenir tous les parents d'un enfant

;with name_tree as 
(
   select id, parentid
   from Users
   where id = 47897 -- this is the starting point you want in your recursion
   union all
   select C.id, C.parentid
   from Users c
   join name_tree p on C.id = P.parentid  -- this is the recursion
   -- Since your parent id is not NULL the recursion will happen continously.
   -- For that we apply the condition C.id<>C.parentid 
    AND C.id<>C.parentid 
) 
-- Here you can insert directly to a temp table without CREATE TABLE synthax
select *
INTO #TEMP
from name_tree
OPTION (MAXRECURSION 0)

SELECT * FROM #TEMP

Cliquez ici pour voir le résultat

MODIFIER:

Si vous souhaitez insérer dans une variable de table, vous pouvez faire quelque chose comme:

-- Declare table varialbe
Declare @TABLEVAR table (id int ,parentid int)


;with name_tree as 
(
   select id, parentid
   from #Users
   where id = 47897 -- this is the starting point you want in your recursion
   union all
   select C.id, C.parentid
   from #Users c
   join name_tree p on C.id = P.parentid  -- this is the recursion
   -- Since your parent id is not NULL the recursion will happen continously.
   -- For that we apply the condition C.id<>C.parentid 
    AND C.id<>C.parentid 
) 
-- Here you can insert directly to table variable
INSERT INTO @TABLEVAR
select *
from name_tree
OPTION (MAXRECURSION 0)

SELECT * FROM @TABLEVAR

Cliquez ici pour voir le résultat

28
Sarath Avanavu

Votre requête fait une récursivité mais en sens inverse. Donc, si vous changez le point de départ en:

where id = 1

alors vous aurez l'utilisateur 1 et tous ses successeurs

0
rtruszk

vous n'avez pas mentionné la sortie et l'entrée souhaitées. Mais vous pouvez essayer comme ça,

Declare @t table (id int ,parentid int)
insert into @t
select 1,1 union all
select 5,1 union all
select 47894,5 union all
select 47897,47894 

;With CTE as
(
select * from @t where id=1
union all
Select a.* from @t a inner join cte b
 on b.id=a.parentid and
a.id<>b.id
)
select * from cte
0
KumarHarsh