Ayuda con una Consulta SQL

05/07/2004 - 08:36 por Y2K | Informe spam
Hola Grupo,

Tengo el siguiente problema:
Tengo 2 tablas uno Categoria y otro Elemento.
La tabla Categoria es de la siguiente forma:

Create Table Categoria(
Id Int Not Null Primary Key,
FK_Depende Int Not Null,
Nombre Varchar(50),
Foreign Key(FK_Depende) References Categoria(Id)
)

La tabla Elemento es de la siguiente forma:

Create Table Elemento(
Id Int Not Null Primary Key,
FK_Categoria Int Not Null,
Nombre Varchar(50)
Foreign Key(FK_Categoria) References Categoria(Id)
)

Como pueden ver la tabla Categoria es recursiva, de esta forma puedo formar
las Categorias en forma de arbol, y un elemento pertenece a una sola
Categoria.

Ahora el problema es que quiero hacer una Select de tal forma que me
devuleva el resultado de una busqueda de una Categoria, por Ejemplo:

Cat1
Cat2
(Ele1)
(Ele2)
Cat3
Cat4
(Ele3)
(Ele4)
(Ele5)
Cat5
(Ele 6)
Cat6
(Ele7)

Si yo quiero los elementos de Cat1 me deberia de devolver:
(Ele1), (Ele2), (Ele3), (Ele4), (Ele5)
esto quiere decir que deberia de devolverme hasta los elementos de sus
subcategorias.
Ademas no esta definido hasta que nivel de subcategoria tenga.

Como podria hacer una consulta(SELECT) que me devuleva este resultado?

Gracias de antemano.
 

Leer las respuestas

#1 Javier Loria
05/07/2004 - 21:49 | Informe spam
Hola:
En jerarquias tienes varias alternativas:
a) SELECT con cierta cantidad de niveles predeterminada. 4-5 Niveles
Maximo sino se hace muy complejo..
b) SELECT Procedimiento/Funcion Anidado: Limite 32 Niveles. (No lo
recomiendo).
c) Estructuras y Jerarquias de CELKO: Ilimitado. Super Rapido, Super
Complicado. Solo en Jerarquias y Estructuras grandes, por ejemplo Sistemas
de Costos.
d) Funciones Procedimental con ciclo: Ilimitado. Facil ,
procedimental, lento en estructuras grandes.
La opcion A) a 4 niveles seria:
==CREATE VIEW CategoriasyDescendientes
SELECT C.CategoriaID, H.CategoriaID AS CategoriaDescendiente
FROM Categorias AS C
JOIN Categorias AS H
ON H.FK_Depende = C.CategoriaID
UNION
SELECT C.CategoriaID, N.CategoriaID
FROM Categorias AS C
JOIN Categorias AS H
ON H.FK_Depende = C.CategoriaID
JOIN Categorias AS N
ON N.FK_Depende = H.CategoriaID
UNION
SELECT C.CategoriaID, B.CategoriaID
FROM Categorias AS C
JOIN Categorias AS H
ON H.FK_Depende = C.CategoriaID
JOIN Categorias AS N
ON N.FK_Depende = H.CategoriaID
JOIN Categorias AS B
ON B.FK_Depende = N.CategoriaID
== Con esta vista luego es facil controlar los elementos con un simple
JOIN:
SELECT ...
FROM Elementos
JOIN CategoriasyDescendientes
ON Elementos.FK_Categoria=CategoriasyDescendientes.CategoriaDescendiente
WHERE CategoriasyDescendientes.CategoriaID= 1
La alternativa D) es mas procedimental pero permite n niveles, y
requiere SQL 2000:
==CREATE FUNCTION CategoriasDescendientes(@CategoriaID INT)
RETURNS @Categorias TABLE(CategoriaID INT NOT NULL PRIMARY KEY)
AS
BEGIN
DECLARE @NumFilasAnterior INT
INSERT @Categorias
VALUES (@CategoriaID)

SET @NumFilasAnterior=0
WHILE @NumFilasAnterior<(SELECT COUNT(*) FROM @Categorias)
BEGIN
SELECT @NumFilasAnterior=COUNT(*) FROM @Categorias

INSERT @Categorias
SELECT Categorias.CategoriaID
FROM Categorias
JOIN @Categorias AS B
ON Categorias.FK_Depende=B.CategoriaID
LEFT JOIN @Categorias AS Anteriores
ON Anteriores.CategoriaID=Categorias.CategoriaID
WHERE Anteriores.CategoriaID IS NULL
AND NOT Categorias.CategoriaID IS NULL
END
RETURN
END
== Con esta funcion luego es muy facil hacer el JOIN
==SELECT ...
FROM Elementos
JOIN dbo.CategoriasDescendientes(1)
ON Elementos.FK_Categoria=CategoriasyDescendientes.CategoriaDescendiente
== Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.





Y2K escribio:
Hola Grupo,

Tengo el siguiente problema:
Tengo 2 tablas uno Categoria y otro Elemento.
La tabla Categoria es de la siguiente forma:

Create Table Categoria(
Id Int Not Null Primary Key,
FK_Depende Int Not Null,
Nombre Varchar(50),
Foreign Key(FK_Depende) References Categoria(Id)
)

La tabla Elemento es de la siguiente forma:

Create Table Elemento(
Id Int Not Null Primary Key,
FK_Categoria Int Not Null,
Nombre Varchar(50)
Foreign Key(FK_Categoria) References Categoria(Id)
)

Como pueden ver la tabla Categoria es recursiva, de esta forma puedo
formar las Categorias en forma de arbol, y un elemento pertenece a
una sola Categoria.

Ahora el problema es que quiero hacer una Select de tal forma que me
devuleva el resultado de una busqueda de una Categoria, por Ejemplo:

Cat1
Cat2
(Ele1)
(Ele2)
Cat3
Cat4
(Ele3)
(Ele4)
(Ele5)
Cat5
(Ele 6)
Cat6
(Ele7)

Si yo quiero los elementos de Cat1 me deberia de devolver:
(Ele1), (Ele2), (Ele3), (Ele4), (Ele5)
esto quiere decir que deberia de devolverme hasta los elementos de sus
subcategorias.
Ademas no esta definido hasta que nivel de subcategoria tenga.

Como podria hacer una consulta(SELECT) que me devuleva este resultado?

Gracias de antemano.

Preguntas similares