Mostrar el último nivel de Categorías

14/01/2008 - 13:15 por Masta | Informe spam
Hola a todos..

Tengo una tabla típica de Categorias (o familias, como prefiráis) de
esta forma:

IDCategoria - Nombre - Parent -Nivel

El caso es que la mayoría de las categorías llegan al nivel 3, pero
tengo categorías que llegan tan sólo al nivel 2.
¿Cómo puedo hacer la consulta para sacar el árbol de una categoría de
nivel 1 pasándole el identificador de esta categoría?

Ejemplo:

Chaquetas (Nivel 1)
-Azules (Nivel 2)
-Verdes (Nivel 2)
-Rojas (Nivel 2.. de esta categoría no colgaría ninguna otra
categoría)

Me gustaría cómo debo hacer la consulta para obtener lo siguiente:

CHAQUETAS - AZULES - PEQUEÑAS
CHAQUETAS - AZULES - MEDIANAS
CHAQUETAS - AZULES - GRANDES
CHAQUETAS - VERDES - PEQUEÑAS
CHAQUETAS - VERDES - MEDIANAS
CHAQUETAS - VERDES - GRANDES
CHAQUETAS - ROJAS

No me aclaro aún muy bien con los unions y los joins.. y me parece que
es lo que se necesita en este caso.

Muchas gracias por vuestra ayuda.
 

Leer las respuestas

#1 Maxi
14/01/2008 - 14:23 | Informe spam
Hola, te paso un ejemplo de como resolver jerarquias en SQL2005.

use adventureworks
go

IF OBJECT_ID('DBO.EMPLEADOS') IS NOT NULL
DROP TABLE DBO.EMPLEADOS
GO

CREATE TABLE DBO.EMPLEADOS (ID INT NOT NULL, JEFE_ID INT NULL,NOMBRE
VARCHAR(300),Puesto varchar(300))
GO

INSERT INTO DBO.EMPLEADOS VALUES (100,NULL,'Emilio','CEO')
INSERT INTO DBO.EMPLEADOS VALUES (101,100,'Maxi','Gerente Sistemas')
INSERT INTO DBO.EMPLEADOS VALUES (102,100,'PIA','Gerente Calidad')
INSERT INTO DBO.EMPLEADOS VALUES (103,101,'Javier','Analista SR')
INSERT INTO DBO.EMPLEADOS VALUES (104,101,'Gabriel','DBA')
INSERT INTO DBO.EMPLEADOS VALUES (105,102,'Ana','Auditora')
INSERT INTO DBO.EMPLEADOS VALUES (106,103,'Luis','Programador')
INSERT INTO DBO.EMPLEADOS VALUES (107,105,'Jose','Asistente')
GO


WITH REPORTE(JEFE_ID, ID,NOMBRE,PUESTO,NIVEL) AS
(
SELECT JEFE_ID, ID,NOMBRE,PUESTO, 0 AS NIVEL
FROM DBO.EMPLEADOS
WHERE JEFE_ID IS NULL -- TRAEMOS TODOS LOS QUE NO TIENEN JEFES Y TIENEN
EL NIVEL 0
UNION ALL
SELECT e.JEFE_ID, e.ID, E.NOMBRE,E.PUESTO,NIVEL + 1
FROM DBO.EMPLEADOS e
INNER JOIN REPORTE d
ON e.JEFE_ID = d.ID
)
SELECT REPORTE.JEFE_ID, REPORTE.ID, REPORTE.NOMBRE,REPORTE.PUESTO,
EMPLEADOS.NOMBRE AS JEFE_NOMBRE, EMPLEADOS.PUESTO AS PUESTO_JEFE
FROM REPORTE LEFT JOIN DBO.EMPLEADOS ON
REPORTE.JEFE_ID = EMPLEADOS.ID
WHERE NIVEL <= 2
GO



-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Masta" escribió en el mensaje
news:
Hola a todos..

Tengo una tabla típica de Categorias (o familias, como prefiráis) de
esta forma:

IDCategoria - Nombre - Parent -Nivel

El caso es que la mayoría de las categorías llegan al nivel 3, pero
tengo categorías que llegan tan sólo al nivel 2.
¿Cómo puedo hacer la consulta para sacar el árbol de una categoría de
nivel 1 pasándole el identificador de esta categoría?

Ejemplo:

Chaquetas (Nivel 1)
-Azules (Nivel 2)
-Verdes (Nivel 2)
-Rojas (Nivel 2.. de esta categoría no colgaría ninguna otra
categoría)

Me gustaría cómo debo hacer la consulta para obtener lo siguiente:

CHAQUETAS - AZULES - PEQUEÑAS
CHAQUETAS - AZULES - MEDIANAS
CHAQUETAS - AZULES - GRANDES
CHAQUETAS - VERDES - PEQUEÑAS
CHAQUETAS - VERDES - MEDIANAS
CHAQUETAS - VERDES - GRANDES
CHAQUETAS - ROJAS

No me aclaro aún muy bien con los unions y los joins.. y me parece que
es lo que se necesita en este caso.

Muchas gracias por vuestra ayuda.

Preguntas similares