Много лет назад на AskTom Марко Стефанетти предложил следующий блестящий подход.Требуется, чтобы каждая таблица считывалась только один раз, и выполняется только одна сортировка.
Контекст является наиболее общим: запрос найдет строки, которые существуют в одной таблице, но не в другой, но - когдаразрешены дубликаты - ТАКЖЕ найдутся строки, которые существуют в обеих таблицах, но они имеют разное количество дубликатов.
Я создаю тестовые данные в предложении WITH;когда вы тестируете решение, вы можете удалить его и начать с последнего оператора SELECT.
with
tablea (id, fruit) as (
select 'A01', 'Apple' from dual union all
select 'A02', 'Orange' from dual union all
select 'A03', 'Pineapple' from dual union all
select 'A03', 'Pineapple' from dual union all
select 'A05', 'Banana' from dual
)
, tableb (id, fruit) as (
select 'A01', 'Apple' from dual union all
select 'A02', 'Orange' from dual union all
select 'A03', 'Pineapple' from dual union all
select 'A04', 'Pineapple' from dual union all
select 'A05', 'Banana' from dual
)
select id, fruit, count(case source when 'tablea' then 1 end) as count_in_a,
count(case source when 'tableb' then 1 end) as count_in_b
from (
select id, fruit, 'tablea' as source from tablea
union all
select id, fruit, 'tableb' as source from tableb
)
group by id, fruit
having count(case source when 'tablea' then 1 end) !=
count(case source when 'tableb' then 1 end)
;
ID FRUIT COUNT_IN_A COUNT_IN_B
--- --------- ---------- ----------
A03 Pineapple 2 1
A04 Pineapple 0 1