Ver Mensaje Individual
  #1  
Antiguo 10-10-2003
Aprendiz Aprendiz is offline
Miembro
 
Registrado: may 2003
Posts: 78
Reputación: 22
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