CTE’S RECURSIVO EN SQL PARA PRINCIPIANTES

Este es el complemento del artículo anterior sobre los CTE en este conoceremos lo que son los Common Table Expressions Recursive. (expresión de la tabla común) donde los resultados del conjunto son temporales donde se puede hacer la referencia el ABC como son SELECT, UPDATE, DELETE, INSERT o también puede crear una vista dentro del CTE.

Una de las ventajas del CTE es que es una sentencia que puede ser no recursiva o recursiva lo cual muchas veces nos ayuda mucho al tratar con ciertos registros.

Estructura.

El CTE se define con una clausula WITH Antes de la consulta principal ya sea un SELECT o INSERT por ejemplo. La cláusula WITH puede incluir uno o más CTE’S

WITH <Common_Table_Expression>

<common_Table_Expression>

Cte_name [ (Column_name [….])]

AS(cte_query)

 

Creación de CTE recursivo.

Esto se refiere que no hace referencia a si misma dentro del CTE.

Para nuestro ejemplo usaremos una tabla que contiene la estructura recursiva simulando archivos dentro de archivos que se llama FolderFromUsers

 

 

En la tabla existe la columna Id que se genera al insertar un registro y la columna Parent que identifica a que carpeta padre pertenece.

 

Con esta consulta obtendremos la jerarquía de los folders según el usuario.

WITH
Folder_CTE
AS (

SELECT
Id, Parent, UserClient, Name
as
NombreCarpeta,
Year
as AnioCreacion,
Month
as MesCreacion

FROM
[MGCSDB_DEV].[dbo].[FolderFromUsers]

WHERE
Parent
IS
NOT
NULL
AND
UserClient
=
‘758d19d3-dd5b-46f4-8e66-c06fd280179e’

UNION
ALL

SELECT
e.Id, e.Parent, e.UserClient, e.Name
as
NombreCarpeta, e.Year
as
AnioCreacion, e.Month
as
MesCreacion

FROM
[MGCSDB_DEV].[dbo].[FolderFromUsers]
e

INNER
JOIN
Folder_CTE
ecte
ON
ecte.Id = e.Parent

)

SELECT
*

FROM
Folder_CTE

 

Donde en esta sección se identifica una unión de la misma tabla para realizar una recursividad donde el Id se une con el parent Id buscando la jerarquía que le corresponde.

SELECT
Id, Parent, UserClient, Name
as
NombreCarpeta,
Year
as AnioCreacion,
Month
as MesCreacion

FROM
[MGCSDB_DEV].[dbo].[FolderFromUsers]

WHERE
Parent
IS
NOT
NULL
AND
UserClient
=
‘758d19d3-dd5b-46f4-8e66-c06fd280179e’

UNION
ALL

SELECT
e.Id, e.Parent, e.UserClient, e.Name
as
NombreCarpeta, e.Year
as
AnioCreacion, e.Month
as
MesCreacion

FROM
[MGCSDB_DEV].[dbo].[FolderFromUsers]
e

INNER
JOIN
Folder_CTE
ecte
ON
ecte.Id = e.Parent

 

En la parte de abajo se manda a llamar la tabla recursiva que en este caso se declaro como Folder_CTE

)

SELECT
*

FROM
Folder_CTE

 

 

Esto es el resultado. Donde se puede apreciar que el registro 16 es el padre y de ahí se desprende el registro 17 que se repite dos veces con sus respectivos hijos.

 

Share: