Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Consulta que "escale" por una tabla de categorías

Estas en el tema de Consulta que "escale" por una tabla de categorías en el foro de SQL Server en Foros del Web. Muy buenas. Quizás con las explicación se entienda mejor. Tabla Categorias: ID | Categoria | IDSuperior ----------------------------- 1 | Cat1 | 2 | Cat2 | ...
  #1 (permalink)  
Antiguo 10/01/2006, 03:15
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Consulta que "escale" por una tabla de categorías

Muy buenas. Quizás con las explicación se entienda mejor.

Tabla Categorias:

ID | Categoria | IDSuperior
-----------------------------
1 | Cat1 |
2 | Cat2 |
3 | Cat1.1 | 1
4 | Cat1.2 | 1
5 | Cat2.1 | 2
6 | Cat1.2.1 | 4
.....
.....

Me gustaría un consulta recursiva que se iniciara en lo siguiente:

SELECT * FROM Categorias WHERE ID = 6

Esta consulta devolvería Cat1.2.1 que pertenece a Cat1.2 y ésta, a su vez a Cat1. Así, se obtendría, por ejemplo, una tabla devuelta de la siguiente manera:

ID | Categoria
---------------
1 | Cat1
4 | Cat1.2
6 | Cat1.2.1

y así en la página web (que es la finalidad de todo) mostrar algo así:

Cat1>Cat1.2>Cat1.2.1

Gracias y un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 10/01/2006, 09:51
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Yo lo que recomendaria es que dividieras la categoria en mas columnas que permitiesen realizar la busqueda que deseas hacer, ya que de primera vista no creo que puedas realizar la consulta que deseas

ID | Cat | Subcat | Subtema | IDSuperior
-----------------------------------------
1 1
2 2
3 1 1 1
4 1 2 1
5 2 1 2
6 1 2 1 4

De tal forma que al realizar la consulta te de la categoria, la subcategoria y el subtema y en tu aplicacion tu conformas el texto un ciclo simple...
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #3 (permalink)  
Antiguo 10/01/2006, 11:46
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Gracias por la respuesta, el problema es que así habría que ir modificando cada categoría cada vez que se inserte una nueva subcategoría.

He encontrado algo sobre hierarchies (jerarquías supongo) que se exactamente lo que busco, aunque todavía nada en español y claro.

Voy a seguir buscando. Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #4 (permalink)  
Antiguo 11/01/2006, 09:04
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
He encontrado este código, pero hay algo que no va bien, pues me devuelve un sólo registro, es como si no entrara en el bucle. La idea es de aquí

Código:
ALTER PROCEDURE MostrarJerarquia 
(
	@Root int
)
AS
	BEGIN
		SET NOCOUNT ON
		DECLARE @ID int, @Categoria char(250)
   
		SET @Categoria = (SELECT Categoria FROM CategoriasFAQS WHERE ID = @Root)
		SELECT @Categoria AS 'Categoría'
		/*PRINT REPLICATE('-', @@NESTLEVEL*4) +  @Categoria*/
   
   		SET @ID = (SELECT ID FROM CategoriasFAQS WHERE IDSuperior = @Root) 
   		WHILE @ID IS NOT NULL
    			BEGIN 
				EXEC MostrarJerarquia @ID
				SET @ID = (SELECT MIN(ID) FROM CategoriasFAQS WHERE IDSuperior = @Root AND ID > @ID)
			END
	END
La tabla de categorías es esta:
ID | Categoria | IDSuperior
-----------------------------
1 | Clientes
2 | Venta
3 | Venta presencial | 2
4 | Venta electrónica | 2
5 | Cuotas | 1
6 | Exenciones | 1
7 | Cursos formación
8 | Ordinaria | 3
9 | Urgente | 3
10 | Ordinaria | 4
11 | Urgente | 4
12 | Anuales | 5
13 | Mensuales | 5
14 | Anuales Tipo A | 12
15 | Anuales Tipo B | 12

Si pongo, por ejemplo, EXEC MostrarJerarquia 10 sólo me devuelve el registro 'Ordinaria' y con EXEC MostrarJerarquia 1 tan sólo 'Clientes'
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #5 (permalink)  
Antiguo 12/01/2006, 10:16
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Creo que el problema se puede solucionar si cambias la linea

SET @ID = (SELECT ID FROM CategoriasFAQS WHERE IDSuperior = @Root)

por

SET @ID = (SELECT IDSuperior FROM CategoriasFAQS WHERE ID = @Root)

La verdad no la probe, pero espero funcione...
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #6 (permalink)  
Antiguo 13/01/2006, 01:23
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Nada, sigue devolviendo un sólo registro.

Gracias.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #7 (permalink)  
Antiguo 19/01/2006, 04:53
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Bueno, ya está, aunque me ha supuesto una función y dos procedimientos almacenados. Allá va:
Código:
ALTER FUNCTION dbo.FN_IDPadre
(@id int)
RETURNS TABLE
AS
RETURN (SELECT ID FROM clasificaciones WHERE ID = (SELECT IDPadre FROM clasificaciones WHERE ID = @id) )

CREATE PROCEDURE PA_SubirJerarquiaSubProceso
(@id int)
AS
BEGIN
	DECLARE @IDPadre int
	DECLARE @Nombre char(250)
	SET @IDPadre = (SELECT ID FROM clasificaciones WHERE ID = (SELECT ID FROM FN_IDPadre(@id)))
	SET @Nombre = (SELECT Nombre FROM clasificaciones WHERE ID = (SELECT ID FROM FN_IDPadre(@id)))
	IF @Nombre IS NULL
		BEGIN
			-- No hay registros
			RETURN
		END
	ELSE
		BEGIN
			INSERT INTO #tempTabla VALUES (@IDPadre, @Nombre)
			EXEC PA_SubirJerarquiaSubProceso @IDPadre
		END
END

CREATE PROCEDURE PA_SubirJerarquia
(@id int)
AS
BEGIN
	CREATE TABLE #tempTabla (ID int IDENTITY PRIMARY KEY, ColID int, ColNombre char(250))
	EXEC PA_SubirJerarquiaSubProceso @id
	SELECT ColID as "ID", ColNombre AS "Nombre" FROM #tempTabla ORDER BY ID ASC
END
Bueno, basta con EXEC PA_SubirJerarquia 8, por ejemplo, y te da todos los grupos superiores a los que pertenece el elemento con la categoría 8.

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:27.