Tengo que seguir los datos en SQL Server 2008 R2. SQLFiddle
Esquema:
CREATE TABLE [dbo]. [ICFilters] ( [ICFilterID] [int] IDENTITY (1,1) NOT NULL, [ParentID] [int] NO NULL DEFAULT 0, [FilterDesc] [varchar] (50) NO NULL, [Activo] [tinyint] NO NULO POR DEFECTO 1, RESTRICCIÓN [PK_ICFilters] CLAVE PRIMARIA CLUSIFICADA ([ICFilterID] ASC) CON PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) ENCENDIDO [PRIMARIO] ) ENCENDIDO [PRIMARIO] INSERT INTO [dbo]. [ICFilters] (ParentID, FilterDesc, Active) Valores (0, 'Tipo de producto', 1), (1, 'ProdSubType_1', 1), (1, 'ProdSubType_2', 1), (1, 'ProdSubType_3', 1), (1, 'ProdSubType_4', 1), (2, 'PST_1.1', 1), (2, 'PST_1.2', 1), (2, 'PST_1.3', 1), (2, 'PST_1.4', 1), (2, 'PST_1.5', 1), (2, 'PST_1.6', 1), (2, 'PST_1.7', 0), (3, 'PST_2.1', 1), (3, 'PST_2.2', 0), (3, 'PST_2.3', 1), (3, 'PST_2.4', 1), (14, 'PST_2.2.1', 1), (14, 'PST_2.2.2', 1), (14, 'PST_2.2.3', 1), (3, 'PST_2.8', 1)
Mesa:
El | ICFILTERID | PARENTID | FILTERDESC | ACTIVO | -------------------------------------------------- El | 1 | 0 | Tipo de producto | 1 | El | 2 | 1 | ProdSubType_1 | 1 | El | 3 | 1 | ProdSubType_2 | 1 | El | 4 | 1 | ProdSubType_3 | 1 | El | 5 | 1 | ProdSubType_4 | 1 | El | 6 | 2 | PST_1.1 | 1 | El | 7 | 2 | PST_1.2 | 1 | El | 8 | 2 | PST_1.3 | 1 | El | 9 | 2 | PST_1.4 | 1 | El | 10 | 2 | PST_1.5 | 1 | El | 11 | 2 | PST_1.6 | 1 | El | 12 | 2 | PST_1.7 | 0 | El | 13 3 | PST_2.1 | 1 | El | 14 3 | PST_2.2 | 0 | El | 15 | 3 | PST_2.3 | 1 | El | 16 3 | PST_2.4 | 1 | El | 17 | 14 PST_2.2.1 | 1 | El | 18 14 PST_2.2.2 | 1 | El | 19 14 PST_2.2.3 | 1 | El | 20 | 3 | PST_2.8 | 1 |
Cada fila tiene la ID de su padre y la raíz parentid = 0
. Los FilterDesc
s son solo descripciones de muestra, así que no puedo tratar de analizarlos para ordenarlos.
La pregunta
¿Es posible seleccionar todas las filas en forma de árbol? ¿Si es así, cómo? Cuando digo 'en forma de árbol', me refiero a seleccionar recursivamente el padre seguido de todos sus hijos, luego todos los hijos de cada uno de ellos y así sucesivamente. Una profundidad del primer recorrido del árbol.
Mis amigos y yo lo hemos intentado, pero nos hemos quedado cortos de soluciones de trabajo, pero seguiremos intentándolo. Soy bastante nuevo en SQL, así que tal vez esto se pueda hacer fácilmente y solo estoy haciendo las cosas más difíciles de lo necesario.
Ejemplo de salida (deseada):
El | ICFILTERID | PARENTID | FILTERDESC | ACTIVO | -------------------------------------------------- El | 1 | 0 | Tipo de producto | 1 | El | 2 | 1 | ProdSubType_1 | 1 | El | 6 | 2 | PST_1.1 | 1 | El | 7 | 2 | PST_1.2 | 1 | El | 8 | 2 | PST_1.3 | 1 | El | 9 | 2 | PST_1.4 | 1 | El | 10 | 2 | PST_1.5 | 1 | El | 11 | 2 | PST_1.6 | 1 | El | 12 | 2 | PST_1.7 | 0 | El | 3 | 1 | ProdSubType_2 | 1 | El | 13 3 | PST_2.1 | 1 | El | 14 3 | PST_2.2 | 0 | El | 17 | 14 PST_2.2.1 | 1 | El | 18 14 PST_2.2.2 | 1 | El | 19 14 PST_2.2.3 | 1 | El | 15 | 3 | PST_2.3 | 1 | El | 16 3 | PST_2.4 | 1 | El | 20 | 3 | PST_2.8 | 1 | El | 4 | 1 | ProdSubType_3 | 1 | El | 5 | 1 | ProdSubType_4 | 1 |