PDA

Ver la Versión Completa : Construcción de SQL dinámica


Aprendiz
10-10-2003, 14:31:32
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:


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:


...
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
10-10-2003, 15:08:53
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

guillotmarc
10-10-2003, 15:39:35
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 :


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.