Recursividad en SQL
Como todo buen diseñador de base de datos sabe, es bastante común encontrarse con entidades recursivas en el diseño de nuestra BD.
La manera más sencilla y clara que es usando la sentencia WITH que es la que usaremos para hacer de manera sencilla la consulta recursiva.
Muchos que ya tienen experiencia en este campo me dirán, ¿y por qué no usas simplemente un cursor para lograrlo?, la respuesta es sencilla, el motor ejecuta de manera más eficiente y con menos consumo de recursos del servidor que usando dicho cursor.
Un algoritmo recursivo siempre tiene que tener:
– Un caso base (donde terminar)
– Un caso iterativo (donde ir iterando a un escenario que cada vez se aproxime más al caso base)
En SQL Server se haría con una CTE. Vamos a usar como ejemplo una tabla con padres e hijos donde nuestro caso base va a ser aquel padre que no es hijo de nadie, tendría esta forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
BEGIN WITH RecursiveSearch AS ( /*Caso base*/ SELECT PH.Id, PH.PadreId, 0 AS LEVEL FROM PersonasHumanas PH WHERE PH.PadreId IS NULL UNION ALL /*Caso recursivo*/ SELECT PH.Id, PH.PadreId, RecursiveSearch.Level + 1 AS LEVEL FROM PersonasHumanas PH INNER JOIN RecursiveSearch RecursiveSearch on RecursiveSearch.Id = PH.PadreId ) SELECT * FROM RecursiveSearch END |