Отбрасывание не нужного количество строк при соединении трех таблиц с помощью 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'