Autounión recursiva de SQL Server

Resuelto Carel asked hace 7 años • 1 respuestas

Tengo una tabla de categorías simple con las siguientes columnas:

  • Identificación
  • Nombre
  • Identificación de los padres

Entonces, una cantidad infinita de categorías pueden ser hijas de una categoría. Tomemos, por ejemplo, la siguiente jerarquía:

ingrese la descripción de la imagen aquí

Quiero, en una consulta simple que devuelve la categoría "Portátiles empresariales", devolver también una columna con todos sus padres, separador de coma o algo así:

ingrese la descripción de la imagen aquí

O tome el siguiente ejemplo:

ingrese la descripción de la imagen aquí

Carel avatar Mar 22 '17 21:03 Carel
Aceptado

cte recursivo al rescate....

Cree y complete una tabla de muestra ( guárdenos este paso en sus preguntas futuras):

DECLARE @T as table
(
    id int,
    name varchar(100),
    parent_id int
)

INSERT INTO @T VALUES
(1, 'A', NULL),
(2, 'A.1', 1),
(3, 'A.2', 1),
(4, 'A.1.1', 2),
(5, 'B', NULL),
(6, 'B.1', 5),
(7, 'B.1.1', 6),
(8, 'B.2', 5),
(9, 'A.1.1.1', 4),
(10, 'A.1.1.2', 4)

El cte:

;WITH CTE AS
(
    SELECT id, name, name as path, parent_id
    FROM @T 
    WHERE parent_id IS NULL
    UNION ALL
    SELECT t.id, t.name, cast(cte.path +','+ t.name as varchar(100)), t.parent_id
    FROM @T t
    INNER JOIN CTE ON t.parent_id = CTE.id
)

La consulta:

SELECT id, name, path
FROM CTE

Resultados:

id      name        path
1       A           A
5       B           B
6       B.1         B,B.1
8       B.2         B,B.2
7       B.1.1       B,B.1,B.1.1
2       A.1         A,A.1
3       A.2         A,A.2
4       A.1.1       A,A.1,A.1.1
9       A.1.1.1     A,A.1,A.1.1,A.1.1.1
10      A.1.1.2     A,A.1,A.1.1,A.1.1.2

Ver demostración en línea en rextester

Zohar Peled avatar Mar 22 '2017 15:03 Zohar Peled