Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Oracle
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-09-2004
HombreSigma HombreSigma is offline
Miembro
 
Registrado: jun 2003
Ubicación: World
Posts: 114
Poder: 21
HombreSigma Va por buen camino
Select con where filtrando a un nivel determinado de un código

Saludos:

Tengo una tabla con un código que tiene un determinado número de níveles, donde cada nivel del código se separa por un punto.

Supongase una tabla como esta:

Código Cantidad
------------ ----------
A.1.2.1.2 200
BB 300
BB.1 400
BB.1.2.1.13 500

De tal manera que una consulta a una tabla como la anterior me entregará para el nivel uno:

A 200
BB 1200

Para el nivel 2:
A 200
A.1 200
BB 1200
BB.1 900

¿Con que tipo de instrucción puedo hacer una forma genérica de consulta has ta n niveles como la anterior?

Gracias
__________________
SigmaMan
Responder Con Cita
  #2  
Antiguo 09-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
En casos como este, en que veo que la cantidad de caracteres por nivel no es fija, podes hacer una función que te devuelva el nivel de un código en particular (contando los puntos, por ejemplo).

Se me ocurre algo como: (tené en cuenta que no he verificado el código).

Código:
Create or replace function NivelDelCodigo(codigo in VarChar2) return number 
IS

Nivel Number;

Begin
  if codigo is Null Then
    return(0);
  nivel := 1;
  Loop
    if InStr(codigo, '.', 1, nivel) > 0 Then
      nivel := nivel + 1;
    else
      exit;
    end if;
  end Loop;
  return(nivel);
end;
/
Una vez hecho esto, es tan simple como:
Código SQL [-]
Select *
  from tabla
 where NivelDelCodigo(codigo) = 2;

Claro que esto no es óptimo... y la sentencia será lenta en tablas con mucha información... en ese caso, es mejor guardar en un campo el nivel del código, crear indices que lo involucren de acuerdo a las consultas que haremos y utilizar este campo en los predicados.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 10-09-2004
HombreSigma HombreSigma is offline
Miembro
 
Registrado: jun 2003
Ubicación: World
Posts: 114
Poder: 21
HombreSigma Va por buen camino
Select sin programar en ningún lenguaje.

En realidad debo utilizar solamente el SELECT de SQL, para reutilizar la sentencia cuando convenga sin necesidad de ejecutar código de cualquier lenguaje diferente de SQL.

Se que existe una instrucción 'occurs' o de nombre similar que puede utilizarse con la sentencia SELECT para contar los puntos delimitadores de niveles.

SELECT A.Codigo, SUM(Valor) FROM A
Pero como A.Codigo o B.Codigo tienen n niveles debo hacer la comparación de los primeros caracteres que vayan hasta el nivel j, seleccionado por el usuario.
TABLA A
Codigo Valor
A 20
A.1 30
A.1.1 50
BB 20
BB.1 20

De tal manera que si la consulta anterior se hace sobre el nivel 1 daría:
A 100
BB 40

Al nivel 2:
A.1 80
BB.1 20
__________________
SigmaMan
Responder Con Cita
  #4  
Antiguo 10-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

La stored function mencionada, está en pl/sql, que es el "lenguaje" de la base de datos oracle, y que se ejecuta en el servidor, sin necesidad de instalar nada adicional, con lo que no representa ningún problema.

Como he dicho antes, es probable que haya forma de plantearlo, con el uso de otra función, y que de esta manera sea mas óptimo, pero eso ya te lo dejo a vos.

Según veo lo que has planteado..... mi solución sigue siendo válida.

Hasta luego.



pd. Agregar que no conozco ninguna función o clausula de nombre occurs...
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Última edición por jachguate fecha: 10-09-2004 a las 21:54:46.
Responder Con Cita
  #5  
Antiguo 11-09-2004
HombreSigma HombreSigma is offline
Miembro
 
Registrado: jun 2003
Ubicación: World
Posts: 114
Poder: 21
HombreSigma Va por buen camino
Gracias por la información.

Se que se puede hacer por código y me parece que tu propuesta está bien.

Lo que ocurre, es que tengo una aplicación que lleva funcionando ya varios años y debo adecuarme a como están planteadas las consultas, las cuales solamente se hacen a travès de meras sentencias SELECT que se almacenan para luego ser reutilizadas.

Codificar en Delphi, por ejemplo, significaría desechar todo un montaje que se gastó varios meses y que la verdad, para el caso de esta aplicación, no es muy conveniente.
__________________
SigmaMan
Responder Con Cita
  #6  
Antiguo 11-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por jachguate
La stored function mencionada, está en pl/sql, que es el "lenguaje" de la base de datos oracle, y que se ejecuta en el servidor, sin necesidad de instalar nada adicional, con lo que no representa ningún problema.
Cita:
Empezado por hombresigma
Codificar en Delphi, por ejemplo
¿en delphi?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 12-09-2004
HombreSigma HombreSigma is offline
Miembro
 
Registrado: jun 2003
Ubicación: World
Posts: 114
Poder: 21
HombreSigma Va por buen camino
??

Quiero decir que se puede hacer código Delphi, POR EJEMPLO, para obtener el resultado deseado, aunque pudiera ser otro lenguaje cualquiera o PL SQL o lo que sea.

Pero quiero que alguien me ayude a construir UNA Y SOLO UNA sentencia Select en SQL, sin bucles ni nada de código de programación diferente.

Se que existen funciones usadas con el SELECT en Oracle que hacen lo que necesito.

Gracias por cualquier información, o por indicarme alguna dirección donde pueda obtener algún manual de la sentencia SELECT de Oracle con todas las funciones que puedan utilizarse dentro de ella.
__________________
SigmaMan
Responder Con Cita
  #8  
Antiguo 13-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Esto mas parece para un examen que para una base de datos del mundo real... de todas formas, te remito a la documentación oficial de oracle

Hasta luego

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:39:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi