-- Your Test Data
with vessel(id, cg, modified_date) as
(select 1, 123, to_date('01012000', 'DDMMYYYY') from dual),
vessel_name(id, name, modified_date) as
(select 1, 'Sea Queen', to_date('01012000', 'DDMMYYYY')
from dual
union all
select 1, 'Sea King', to_date('01012001', 'DDMMYYYY')
from dual
union all
select 1, 'Sea Goodess', to_date('03012005', 'DDMMYYYY')
from dual),
vessel_horsepower(id, hp, modified_date) as
(select 1, 50, to_date('02012000', 'DDMMYYYY')
from dual
union all
select 1, 75, to_date('01012003', 'DDMMYYYY')
from dual
union all
select 1, 110, to_date('03012005', 'DDMMYYYY')
from dual)
-- Select:
select m.id,
-- determine value of table "vessel" for current id, modified_date
(select cg
from vessel n
where n.id = m.id
and n.modified_date =
(select max(nn.modified_date)
from vessel nn
where nn.id = n.id
and nn.modified_date <= m.modified_date)),
-- determine value of table "vessel_name" for current id, modified_date
(select name
from vessel_name n
where n.id = m.id
and n.modified_date =
(select max(nn.modified_date)
from vessel_name nn
where nn.id = n.id
and nn.modified_date <= m.modified_date)),
-- determine value of table "vessel_horsepower" for current id, modified_date
(select hp
from vessel_horsepower n
where n.id = m.id
and n.modified_date =
(select max(nn.modified_date)
from vessel_horsepower nn
where nn.id = n.id
and nn.modified_date <= m.modified_date)),
m.modified_date
from -- collect all modified_dates of an id:
(select v.id, v.modified_date
from vessel v
union
select v.id, v.modified_date
from vessel_name v
union
select v.id, v.modified_date
from vessel_horsepower v) m;