Я склонен использовать агрегацию для этого. Вот один из методов:
select c.customerId
from dbo.Products p
where p.productName in ('Milk', 'Bread')
group by c.customerId
having sum(case when p.productName = 'Milk' then 1 else 0 end) > 0 and
sum(case when p.productName = 'Bread' then 1 else 0 end) = 0 ;
Вы можете добавить join
, чтобы получить имя клиента, если оно вам действительно нужно.
В основном, это подсчитывает количество строк для каждого клиента, которые имеют 'Milk'
. > 0
говорит, что есть хотя бы один. Затем он подсчитывает количество строк, которые имеют 'Bread'
. = 0
говорит, что их нет.