eamos...
Tenemos las tablas:
AB(ZONA, FASE, COD_SITIO)
FILTROS(VALOR_FILTRO, IDPERSONA, NOM_FILTRO)
La consulta devuelve una tabla derivada D1:
D1(ZONA, FASE, COD_SITIO)
Por lo que analizo, la idea es que los datos que devuelva la consulta final deben cumplir con los siguientes criterios:
- ZONA, FASE y COD_SITIO deben ser iguales entre sí (por transitividad, si a=d, b=d, c=d => a=b=c).
- ZONA, FASE y COD_SITIO deben ser iguales a VALOR_FILTRO
- La consulta debe devolver todos los campos de la tabla AB que cumplan con los dos criterios más el valor de VALOR_FILTRO correspondiente.
Si lo pensás, lo primero que debes hacer es restringir la búsqueda a las tuplas que cumplen el primer o el segundo criterio, de esa forma eliminarías una importante cantidad de tuplas.
Cita: SELECT ab.zona, ab.fase, ab.cod_sitio
FROM ab
JOIN filtros ON ab.cod_sitio = filtros.valor_filtro AND ab.fase = filtros.valor_filtro AND ab.zona = filtros.valor_filtro ;
Y a eso hay que darle el condicional:
Cita: SELECT ab.zona, ab.fase, ab.cod_sitio
FROM ab
JOIN filtros ON ab.cod_sitio = filtros.valor_filtro AND ab.fase = filtros.valor_filtro AND ab.zona = filtros.valor_filtro
WHERE (filtros.idpersona = '1'
AND filtros.nom_filtro = 'filtro')
Puse los () después del where para que considere la condición doble como una sola uniad.
Probalo y contame.
Saludos...
Gonzalo