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.