Esa consulta que tu haces en un bucle es lo mismo que hacer la union de todas las consultas. Cuidado que hay que tener con una union: todas las selects deben devolver el mismo número de valores y del mismo tipo sino te dará un error en ejecución.
Código:
select 'Book',*
from referencia r join book b on r.Id_Reference=b.Id_Rerence
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Journal',*
from referencia r join journal j on r.Id_Reference=j.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Conferencia',*
from referencia r join conferencia c on r.Id_Reference=c.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Thech-report',*
from referencia r join thecnical_report t on r.Id_Reference=t.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Thesis',*
from referencia r join thesis th on r.Id_Reference=th.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Miscellaneous',*
from referencia r join miscellaneous m on r.Id_Reference=m.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
Esto te tiene que funcionar. Al fin y al cabo es lo mismo que tú estás haciendo por programación, pero en una única consulta a la base de datos.
Recuerda: todas las selects deben develver el mismo número de datos y del mismo tipo. Si en una select quieres que te devuelva un número, pero no en el resto, es tan fácil como en esa posición de las demás selects meter un número como una constante.
En las selects he puesto un '*', porque no sé que datos quieres y no conozco la estructura de tus tabla, lo habitual, es enumerar exactamente los campos que se quieren, pues si lo has separado en tablas es de suponer que no tienen igual estructura. La constante inicial es para conocer de que tabla viene el dato, si no lo necesitas conocer, la quitas.
Espero que esto te sirva y te facilite las cosas.
Un saludo.