Не уверен, что это полезно для вас, чтобы дать идею, я сделал на SQL сервере, и вы можете достичь, используя левое соединение, перекрестное соединение и не существует.
Не существует необходимо, поскольку перекрестное соединение не упорядочено должным образом и не равно, будет сравнивать строку за строкой, поэтому добавление не существует устранит это.
with PRODUCT as (select 1 as ID, 'Apple'as name
union all
select 2 as ID, 'Orange'as name),
customer as (select 1 as ID, 'bill' as name union all
select 2 as ID, 'bob' as name union all
select 3 as ID, 'ben' as name ),
jointbl as (select 1 as Product_id, 2 as Customer_id union all
select 2 as Product_id, 1 as Customer_id union all
select 2 as Product_id, 2 as Customer_id)
select distinct c.id as Customer_id ,c.name as Customer_name, p.name as Fruit_name,
p.ID as Product_id
from customer c
left join jointbl j on c.ID = j.Customer_id
cross join PRODUCT p
where isnull(p.ID,-1) <> isnull(j.Product_id,-1) and not exists (select 1 from PRODUCT p1
join jointbl j1 on p1.ID = j1.Product_id
where p.ID = p1.id and j1.Customer_id = c.ID)
order by 1
Вывод: