Hola,
he estado mirando por encima la consulta, y hay algo que me 'cruje'.
Código SQL
[-]
from
(recibo r inner join registro_consulta_med c on r.nro_recibo=c.nro_recibo),
c_externa c1, // ** AQUI ME CRUJE **//
especialidad e, // ** AQUI ME CRUJE **//
doctor d // ** AQUI ME CRUJE **//
where
(
(c.nro_consulta=c1.nro)and(c1.id_doctor=d.ci)and(d.esp=e.nro)and(cast(r.fecha as date) between :f1 and :f2)
and
((r.cancelado=:valor)or(r.cancelado='M'))
Estás utilizando tablas en la consulta que no están incluidas en ningún inner join, por lo que te debe ( en teoría según lo que tengo entendido ) devolverte más filas de las que necesitas. Ahora no me sale el nombre de esa forma de hacer una select
SELECT * form TABLA1, TABLA2 -> devuelve el nº de registros de TABLA1 multiplicado por el nº de registros de TABLA2, que obviamente PUEDE que no sea el resultado que necesites.
Lo normal es hacer
SELECT * FROM TABLA1 T1
INNER JOIN TABLA2 T2 ON ( T1.ID=T2.ID)
WHERE condiciones
que devolverá los registros que existan en las dos tablas y cumplan las condiciones
Espero haberte ayudado.
Saludos