virtuoso query example dpedia sql-server tsql recursion hierarchy recursive-cte

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.