¿Cuál es la forma más sencilla de realizar una autounión recursiva en SQL Server? Tengo una mesa como esta:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
Y quiero poder obtener los registros solo relacionados con una jerarquía que comience con una persona específica. Entonces, si solicitara la jerarquía de CJ por PersonID = 1, obtendría:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
Y para EB obtendría:
PersonID | Initials | ParentID
2 EB 1
4 SW 2
Estoy un poco atascado en esto, no puedo pensar en cómo hacerlo aparte de una respuesta de profundidad fija basada en un montón de combinaciones. Esto serviría como sucede porque no tendremos muchos niveles, pero me gustaría hacerlo correctamente.
¡Gracias! Chris.

Respuestas:
Al agregar la condición de pedido, puede preservar el orden del árbol:
Al cambiar la
ORDER BYcondición, puede cambiar el orden de los hermanos.fuente
PersonID = theIdYouAreLookingForlugar deParentID IS NULL.WITHcláusula. Si necesita información específica, cree un violín en sqlfiddle.com y publique el enlace aquí.Usando CTE puede hacerlo de esta manera
fuente
La consulta de Quassnoi con un cambio para tabla grande. Padres con más hijos que 10: formateado como str (5) el número de fila ()
CON q COMO ( SELECT m. *, CAST (str (ROW_NUMBER () OVER (ORDER BY m.ordernum), 5) AS VARCHAR (MAX)) COLLATE Latin1_General_BIN AS bc DESDE #tm DONDE ParentID = 0 UNIÓN TODOS SELECCIONE m. *, Q.bc + '.' + str (ROW_NUMBER () OVER (PARTICIÓN POR m.ParentID ORDER BY m.ordernum), 5) COLLATE Latin1_General_BIN DESDE #tm ÚNETE q ON m.parentID = q.DBID ) SELECCIONE * DESDE q PEDIR POR antes de Cristofuente
SQL 2005 o posterior, los CTE son el camino estándar a seguir según los ejemplos que se muestran.
SQL 2000, puede hacerlo usando UDF -
(que funcionará en 2005, simplemente no es la forma estándar de hacerlo. Dicho esto, si encuentra que es la forma más fácil de trabajar, hágalo funcionar)
Si realmente necesita hacer esto en SQL7, puede hacer aproximadamente lo anterior en un sproc pero no pudo seleccionarlo; SQL7 no admite UDF.
fuente
Verifique lo siguiente para ayudar a comprender el concepto de recursividad CTE
fuente