SELECT y estructura del tipo arbol

27/04/2008 - 23:13 por Cristian Meneses | Informe spam
Buenas a todos
Tengo una tabla para introducir valores y obtener una estructura del
tipo arbol.
La idea es que un padre pueda tener muchos "hijos", y guardo el valor
de nivel para acelerar luego un select para obtener todo ordenado tal
como lo mostraria en un control del tipo treeview.
En el caso de los primeros padres IDPadre = NULL y Nivel = 1, el valor
de Numero es controlado en el insert para que no se repitan, y pueden
haber hijos con numero 1, 2, 3, 8, 15, etc.. sucesivamente.
La duda surge al hacer este select, ya que si ordeno por Nivel,
IDPadre y Numero no obtengo el contenido como lo deseo. Alguna
sugerencia?
Dejo a continuacion las sentencias sql para que lo prueben...


if NOT (object_id('tempdb.dbo.#TablaAux') is null)
DROP TABLE #TablaAux

CREATE TABLE #TablaAux
(
IDH int IDENTITY (1,1) NOT FOR REPLICATION NOT NULL,
IDPadre int NULL,
Descripcion varchar(50) NOT NULL,
Numero int NOT NULL,
Nivel tinyint NOT NULL,
Eliminado bit NOT NULL
)

INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (NULL, 'Padre1', 1, 1, 0) --ID 1
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (NULL, 'Padre2', 2, 1, 0) --ID 2
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (NULL, 'Padre3', 3, 1, 0) --ID 3
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (1, 'Hijo11', 1, 2, 0) --ID 4
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (1, 'Hijo12', 2, 2, 0) --ID 5
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (2, 'Hijo21', 1, 2, 0) --ID 6
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (2, 'Hijo22', 2, 2, 0) --ID 7
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (3, 'Hijo31', 1, 2, 0) --ID 8
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (4, 'Nieto111', 1, 3, 0) --ID 9
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (4, 'Nieto112', 2, 3, 0) --ID 10
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (7, 'Nieto221', 1, 3, 0) --ID 11
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (7, 'Nieto222', 2, 3, 0) --ID 12
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (8, 'Nieto311', 1, 3, 0) --ID 13
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (8, 'Nieto315', 5, 3, 0) --ID 14
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (8, 'Nieto318', 8, 3, 0) --ID 15

SELECT * FROM #TablaAux


Muchas gracias por adelantado...



Cristian Meneses
 

Leer las respuestas

#1 Enrique Catala Bañuls
27/04/2008 - 23:56 | Informe spam
antes de nada, ¿utilizas SQL Server 2005?, lo digo porque si es afirmativo
existe una sintaxis para realizar consultas recursivas de forma sencilla y
sin necesidad de montarse tablas auxiliares.

http://msdn2.microsoft.com/en-us/li...86243.aspx

Un saludo
Enrique Catala Bañuls
Solid Quality Mentors



"Cristian Meneses" wrote:

Buenas a todos
Tengo una tabla para introducir valores y obtener una estructura del
tipo arbol.
La idea es que un padre pueda tener muchos "hijos", y guardo el valor
de nivel para acelerar luego un select para obtener todo ordenado tal
como lo mostraria en un control del tipo treeview.
En el caso de los primeros padres IDPadre = NULL y Nivel = 1, el valor
de Numero es controlado en el insert para que no se repitan, y pueden
haber hijos con numero 1, 2, 3, 8, 15, etc.. sucesivamente.
La duda surge al hacer este select, ya que si ordeno por Nivel,
IDPadre y Numero no obtengo el contenido como lo deseo. Alguna
sugerencia?
Dejo a continuacion las sentencias sql para que lo prueben...


if NOT (object_id('tempdb.dbo.#TablaAux') is null)
DROP TABLE #TablaAux

CREATE TABLE #TablaAux
(
IDH int IDENTITY (1,1) NOT FOR REPLICATION NOT NULL,
IDPadre int NULL,
Descripcion varchar(50) NOT NULL,
Numero int NOT NULL,
Nivel tinyint NOT NULL,
Eliminado bit NOT NULL
)

INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (NULL, 'Padre1', 1, 1, 0) --ID 1
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (NULL, 'Padre2', 2, 1, 0) --ID 2
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (NULL, 'Padre3', 3, 1, 0) --ID 3
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (1, 'Hijo11', 1, 2, 0) --ID 4
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (1, 'Hijo12', 2, 2, 0) --ID 5
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (2, 'Hijo21', 1, 2, 0) --ID 6
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (2, 'Hijo22', 2, 2, 0) --ID 7
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (3, 'Hijo31', 1, 2, 0) --ID 8
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (4, 'Nieto111', 1, 3, 0) --ID 9
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (4, 'Nieto112', 2, 3, 0) --ID 10
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (7, 'Nieto221', 1, 3, 0) --ID 11
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (7, 'Nieto222', 2, 3, 0) --ID 12
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (8, 'Nieto311', 1, 3, 0) --ID 13
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (8, 'Nieto315', 5, 3, 0) --ID 14
INSERT INTO #TablaAux (IDPadre, Descripcion, Numero, Nivel, Eliminado)
VALUES (8, 'Nieto318', 8, 3, 0) --ID 15

SELECT * FROM #TablaAux


Muchas gracias por adelantado...



Cristian Meneses

Preguntas similares