Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-10-2003
Aprendiz Aprendiz is offline
Miembro
 
Registrado: may 2003
Posts: 78
Poder: 21
Aprendiz Va por buen camino
Construcción de SQL dinámica

Vamos a ver, hola ante todo, no se ni como empezar a plantear la cuestión, en fin lo intentaremos:

Tengo por un lado una tabla principal de la que dependen tablas "esclavas":

FICHA_PNT MODELOS_PNT FORMATOS_PNT
------------- ------------------- --------------------
ID_PNT ID_PNT ID_PNT
TITULO ID_MODELO ID_FORMATO
NOTAS
ETC...

Evidentemente también existen las tablas de Modelos y Formatos donde se guardan el resto de información de las mismas, pero para la consulta no son importantes.

Tengo implementada una pantalla de búsqueda, donde tengo dos listas, una para modelos y otra para formatos. A cada una de las listas el usuario va añadiendo "valores" existentes. Así como resultado puedo tener una lista de modelos, por ejemplo, con cincon lineas correspondientes a cinco modelos distintos.

Al lado de la lista tengo un RadioGroup con dos items correspondientes a los dos tipos de conectores de la consulta, "OR" y "AND".

Cuando el usuario le da al botón buscar de la pantalla, para cada una de las listas se construye la consulta a partir de los datos introducidos por el usuario.

Y aquí viene la duda, en el caso del conector "OR", no hay problema pues cuando hago la select e introduzco el inner join, con la tabla de modelos por ejemplo, al considerarse registro a registro puedo poner cosas como:

Código:
  WHERE ... ID_MODELO='5' OR ID_MODELO='6' OR ETC...
Como resultado de esto tendré todos los que cumplen alguna condición. Ahora bien el problema surge con el conector "AND".

Pues la pregunta sería quiero todos los ID_PNT que en su lista de modelos tienen esta lista de modelos suministrados por el usuario.

En este caso he hecho esto:

Código:
    ...
    FROM FICHA_PNT INNER JOIN MODELOS_PNT MODPNT ON ...
    WHERE ... '5' in (SELECT ID_MODELO FROM MODELOS_PNT MODPNT2 WHERE MODPNT2.ID_PNT=MODPNT.ID_PNT)
AND
'6' in (SELECT ID_MODELO FROM MODELOS_PNT MODPNT2 WHERE MODPNT2.ID_PNT=MODPNT.ID_PNT)
AND
...
Evidentemente los valores de los ID los paso automáticamente o los construyo dinámicamente. El problema surge que si en la lista hay 5 valores tengo que hacer 5 subconsultas del tipo descrito, una para cada valor de la lista.

Mi pregunta es si sabeis de una manera mejor de hacerlo, o si hay alguna clausula del SELECT que haya pasado por alto y facilite la consulta.

Gracias por vuestra colaboración y respuestas.

Saludos
__________________
[Aprendiz]: Por que siempre hay algo nuevo que aprender.
Responder Con Cita
  #2  
Antiguo 10-10-2003
Aprendiz Aprendiz is offline
Miembro
 
Registrado: may 2003
Posts: 78
Poder: 21
Aprendiz Va por buen camino
Un ejemplo de pregunta puede ser:

Quiero que me enseñes todos los PNT que tengan en su lista de modelos el '1' y el '2'.

Saludos
__________________
[Aprendiz]: Por que siempre hay algo nuevo que aprender.

Última edición por Aprendiz fecha: 10-10-2003 a las 14:18:13.
Responder Con Cita
  #3  
Antiguo 10-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

A mi no me parece que se pueda construir una consulta mejor que esa, que haga este calculo.

Lo único seria quizá ponerlo en un procedimiento almacenado, para no tener que construir dinamicamente la sentencia SQL. Pero el rendimiento seria similar, ya que tendría que hacerlo igual : para cada registro, mirar si está con el '5', mirar con el '6', etc. ...

Un ejplo en Firebird :

Código:
for select ID
    from Tabla
    into :ID  
do begin
   if ((:P1 is null) or (:P1 in select Modelo From Relacionada where ID = :ID)) and
      ((:P1 is null) or (:P1 in select Modelo From Relacionada where ID = :ID)) and
      ....... 
      ((:Pn is null) or (:Pn in select Modelo From Relacionada where ID = :ID)) then begin
       suspend;
   end 
end;
NOTA : El Or lo puedes simplificar un poco con un :

WHERE ... ID_MODELO in ('5', '6', ...)

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 10-10-2003 a las 14:49:14.
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 07:58:49.


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