Отбрасывание не нужного количество строк при соединении трех таблиц с помощью JOIN

Необходимо чтобы получилось одинаковое число записей у обоих выборок, основываясь на 1 Выборку. Версия Oracle 12.1.0.1.0

1 Выборка

select count(*) 
from t_pet t, 
     t_block t2 
where t.id=t2.id_ger 
  and trunc(t2.date_end) > '01.01.2000'

Есть еще и третья таблица которая также может соединятся по id

2 Выборка

select count(*) 
from t_pet t, 
     t_block t2, 
     t_block_outboundmess t3 
where t.id=t2.id_ger 
  and t2.id_ger=t3.id_outletter 
  and trunc(t2.date_end) > '01.01.2000' 

Ответы (2 шт):

Автор решения: 0xdb

Начиная с 12.01 с CROSS APPLY:

select count(*) 
from t_pet t 
join t_block t2 on t2.id_ger = t.id 
cross apply (
    select max (id_outletter) keep (dense_rank first order by null) id_outletter
    from t_block_outboundmess t3
    where t3.id_outletter = t2.id_ger) t3
where trunc(t2.date_end) > date'2000-01-01'

Если версия 11g и старше, то так:

select count(*) 
from t_pet t 
join t_block t2 on t2.id_ger = t.id 
join (
    select max (id_outletter) keep (dense_rank first order by null) id_outletter
    from t_block_outboundmess) t3 on t3.id_outletter = t2.id_ger
where trunc(t2.date_end) > date'2000-01-01' 

На db<>fiddle.

→ Ссылка
Автор решения: wq55
select count(*) 
from t_pet t 
left join t_block t2 on t2.id_ger = t.id 
left join (select * from
(select u.*, row_number() over (partition by id_outletter order by date_response desc)num 
from t_block_outboundmess u) where num=1) t3 on t3.id_outletter = t2.id_ger
where trunc(t2.date_end) > date'2000-01-01'
→ Ссылка