sql server - query - Obtener todos los padres para un niño
sparql example (3)
Quiero recuperar el parentid de un ID, si ese parentid tiene un padre que lo recupera de nuevo, y así sucesivamente. Tipo de tabla de jerarquía.
id----parentid
1-----1
5-----1
47894--5
47897--47894
Soy nuevo en el servidor SQL y probé, algunas consultas como:
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;
Me está dando sólo una fila. y también quiero insertar estos registros en una variable de tabla temporal. Cómo puedo hacer esto. gracias por adelantado. perdón por hacer la pregunta simple (aunque no para mí)
Intenta esto para conseguir todos los padres de un niño
;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
Haga clic aquí para ver el resultado
EDITAR:
Si desea insertar en una variable de tabla, puede hacer algo como:
-- 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
Haga clic aquí para ver el resultado
No mencionaste la salida y entrada deseadas. Sin embargo puedes intentarlo así,
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
Su consulta está haciendo recursión pero en dirección opuesta. Así que si cambias el punto de partida a:
where id = 1
Entonces tendrás usuario 1
y todos sus sucesores.