¿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 BY
condición, puede cambiar el orden de los hermanos.fuente
PersonID = theIdYouAreLookingFor
lugar deParentID IS NULL
.WITH
clá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 ()
fuente
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