[SOLUCIONADO] error al aplicar perfil de datos a un sql

Buenas, le escribo porque tengo un problema que no eh podido resolver, a ver si me pueden ayudar.
al momento de consultar un sql le aplico el perfil de datos t en vez de agregarse dicha condicion en el where la misma aparece en medio de una subconsulta.
adjunto el sql y tambien el error que me aparece en el logger.
desde ya gracias…

$sql = “SELECT b.dependencia,b.sub_tipo,b.tipo,count(b.id_proyecto) as cantidad FROM (select b.*,g.fecha_hasta,h.descripcion as tipo from tipo_proyecto h,proyectos_con_director_estado_tipo_y_subtipo b LEFT OUTER JOIN (select MAX(fecha_hasta) AS fecha_hasta, id_proyecto FROM r_proyecto_prorroga GROUP BY id_proyecto) AS g ON b.id_proyecto=g.id_proyecto
where b.id_tipo_proyecto=2 and b.id_tipo_proyecto=h.id_tipo_proyecto and id_subtipo_proyecto not in (60,58,61))as b,
((SELECT f.id_proyecto from r_proyecto_estado f,(SELECT id_proyecto,MAX(fecha_cambio) as fecha_cambio FROM r_proyecto_estado where fecha_cambio <= $f2 GROUP BY id_proyecto ORDER BY id_proyecto) j
WHERE j.id_proyecto = f.id_proyecto and j.fecha_cambio = f.fecha_cambio and id_estado in (6,12,13)) union (SELECT id_proyecto FROM r_proyecto_estado WHERE id_estado IN (8,9,10,14,15) AND fecha_cambio between $f1 AND $f2)) as c
$where AND b.id_proyecto = c.id_proyecto AND b.id_tipo_proyecto = 2
GROUP BY b.sub_tipo,b.dependencia,b.tipo ORDER BY dependencia,sub_tipo desc”;

$sql = toba::perfil_de_datos()->filtrar($sql);
$datos = toba::db()->consultar($sql);

error que muestra

toba_error_db:

SQLSTATE: db_42601

CODIGO: 7

MENSAJE: ERROR: error de sintaxis en o cerca de «WHERE» LINE 2: …cambio = f.fecha_cambio and id_estado in (6, 12, 13) WHERE ^

SQL: SELECT b.dependencia, b.sub_tipo, b.tipo, count(b.id_proyecto) as cantidad FROM (select b.*, g.fecha_hasta, h.descripcion as tipo from tipo_proyecto h, proyectos_con_director_estado_tipo_y_subtipo b LEFT OUTER JOIN (select MAX(fecha_hasta) AS fecha_hasta, id_proyecto FROM r_proyecto_prorroga GROUP BY id_proyecto) AS g ON b.id_proyecto=g.id_proyecto where b.id_tipo_proyecto=2 and b.id_tipo_proyecto=h.id_tipo_proyecto and id_subtipo_proyecto not in (60, 58, 61))as b, (SELECT f.id_proyecto from r_proyecto_estado f, (SELECT id_proyecto, MAX(fecha_cambio) as fecha_cambio FROM r_proyecto_estado where fecha_cambio <= ‘2009-12-31’ GROUP BY id_proyecto ORDER BY id_proyecto) j WHERE j.id_proyecto = f.id_proyecto and j.fecha_cambio = f.fecha_cambio and id_estado in (6, 12, 13) WHERE -------- PERFIL DE DATOS -------- ( b.id_tipo_proyecto IN (‘2’) ) ------------------------ union SELECT id_proyecto FROM r_proyecto_estado WHERE id_estado IN (8,9,10,14,15) AND fecha_cambio between ‘2009-01-01’ AND ‘2009-12-31’ ) as c WHERE 1 = 1 AND b.id_subtipo_proyecto IN (67) AND b.id_proyecto = c.id_proyecto AND b.id_tipo_proyecto = 2 GROUP BY b.sub_tipo ,b.dependencia ,b.tipo ORDER BY dependencia ,sub_tipo desc

Hola German,

segun veo se esta perdiendo en el lugar en que incluye el perfil de datos, lo que te recomendaria es que le apliques perfil de datos a aquellas subconsultas que lo necesiten y no a toda la consulta completa, Toba no tiene un parser SQL completo, por lo cual se puede perder con consultas de esta complejidad de anidamiento.

Creo que el punto central de la “confusion” aqui, es que el UNION se esta detectando como si fuera un agrupador de ultimo nivel, cuando en realidad esta dentro de una de las ramas del producto cartesiano, eso hace que este colocando el perfil de datos en el lugar equivocado.

Si necesitas hacer un perfil de datos sobre toda la consulta, hacelo antes de reemplazar las subconsultas… ya que cualquier disparador que se encuentre en ellas, deberia ser tomado en cuenta al momento de filtrar la subconsulta.

Saludos

Gracias richard, reemplace las subq por vistas y quedo.

Saludos