Это не намного более оптимально, но, вероятно, более читабельно:
select *
from A a, B b
Where
a.id_a = b.id
and a.valid_from = (select max(valid_from)
from A
where id_a = b.id
and valid_from <= b.date)
order by valid_from desc
Я уже видел эту проблему раньше, и лучший из известных мне способов ее оптимизации - поместить столбец valid_to в таблицу A.
Для последней записи в ней должна быть указана самая большая дата, которую может обработать Oracle.
Всякий раз, когда вы создаете более новую версию записи, обновляйте ее во время создания новой записи (минус миллисекунда, чтобы избежать дублирования), чтобы у вас было что-то вроде этого:
ID Valid_from Valid_to
1 01/01/2011 12.34.56.0000 02/01/2011 12.34.56.0000
1 02/01/2011 12.34.56.0001 03/01/2011 12.34.56.0000
1 03/01/2011 12.34.56.0001 31/12/9999 23.59.59.9999
Тогда вы можете запросить это так:
select *
from A a, B b
Where
a.id_a = b.id
and b.date between a.valid_from and a.valid_to
order by valid_from desc
С индексом по столбцам даты производительность должна быть в порядке ..