Вывод логического типа колонки должна поддерживать СУБД.
А так, на практике, гарантировано можно работать с нулл/не нулл или 0/ не 0 флагами.
а) Использовать left join и проверять не нулл значение, какого нибудь поля присоединенной таблицы (например, b.table1id).
SELECT distinct a.id, a.rank, a.firstname, a.name,
a.secondname, b.table1id
FROM table1 as a
left JOIN table2 as b on b.table1id = a.id and b.dateto < ?
б) Или считать количество строк подзапросом у порисоединенной таблицы. Можно оптимизировать, отрезав по первой записи rownum = 1, тогда cnt получите 0 или 1.
SELECT a.id, a.rank, a.firstname, a.name,
a.secondname, (select count(*) from table2 as b on b.table1id = a.id and b.dateto < ? and rownum = 1) cnt
FROM table1 as a
в) Если поддерживается логика в выводе колонки:
SELECT a.id, a.rank, a.firstname, a.name,
a.secondname, exists(select 1 from table2 as b on b.table1id = a.id and b.dateto < ?) as is_exists
FROM table1 as a