У меня проблемы с поиском оптимального решения этой проблемы:
У меня есть 2 таблицы: test_a и test_b.
Test_a хранит информацию о клиентах, покупающих продукты.
Test_b - это, в основном, таблица продуктов, в которой перечислены продукты, которые я хотел бы отслеживать. Клиенты могут купить много продуктов, но не все продукты находятся в test_b, только продукты, которые я хотел бы отследить, находятся в test_b.
Я бы хотел отследить, какие продукты не покупают отдельные клиенты.
Упрощенная таблица test_a и test_b будет выглядеть следующим образом:
test_a

Test_b

Я пробовал это утверждение:
select * from test_a a
right outer join test_b b
on trim(a.product) = trim(b.product)
Вышеприведенное утверждение только говорит мне, какой продукт ни один покупатель не купил вообще, но не говорит мне, какой продукт для каждого конкретного клиент не покупает. Мне бы хотелось, чтобы в результате было показано, что дата покупки этого продукта не указана для конкретного покупателя, который не покупает этот продукт, если он купил продукт, то поле dateofpurchase является фактической датой покупки.
** * Обновление
Результат, который я хотел бы видеть:

Существует ли чистый и эффективный способ достижения поставленной цели? над? Один из подходов, который я могу придумать, может состоять в том, чтобы выполнить полное внешнее объединение, а затем отфильтровать продукты, отсутствующие в test_b, но это не очень эффективно. Моя настоящая таблица test_a содержит пару миллионов записей, а test_b содержит около тысячи записей.
Прилагается скрипт примеров таблиц, о которых я упоминал выше:
CREATE TABLE "TEST_A"
( "ID" NUMBER(3,0),
"CUSTOMER" VARCHAR2(26 BYTE),
"PRODUCT" VARCHAR2(26 BYTE),
"DATEOFPURCHASE" DATE
) ;
Insert into TEST_A (ID,CUSTOMER,PRODUCT,DATEOFPURCHASE) values (1,'A ','P1',to_date('12-DEC-19','DD-MON-RR'));
Insert into TEST_A (ID,CUSTOMER,PRODUCT,DATEOFPURCHASE) values (2,'A ','P2',to_date('01-NOV-17','DD-MON-RR'));
Insert into TEST_A (ID,CUSTOMER,PRODUCT,DATEOFPURCHASE) values (3,'A ','P3',to_date('01-JAN-20','DD-MON-RR'));
Insert into TEST_A (ID,CUSTOMER,PRODUCT,DATEOFPURCHASE) values (4,'A ','P4',to_date('15-JUL-15','DD-MON-RR'));
Insert into TEST_A (ID,CUSTOMER,PRODUCT,DATEOFPURCHASE) values (5,'B','P1',to_date('01-APR-16','DD-MON-RR'));
Insert into TEST_A (ID,CUSTOMER,PRODUCT,DATEOFPURCHASE) values (6,'B','P3',to_date('12-AUG-18','DD-MON-RR'));
Insert into TEST_A (ID,CUSTOMER,PRODUCT,DATEOFPURCHASE) values (7,'C','P3',to_date('15-JUN-12','DD-MON-RR'));
CREATE TABLE "TEST_B"
( "PRODUCT" VARCHAR2(26 BYTE),
"DEPARTMENT" NUMBER(3,0)
) ;
Insert into TEST_B (PRODUCT,DEPARTMENT) values ('P1',1);
Insert into TEST_B (PRODUCT,DEPARTMENT) values ('P2',2);