SQL-запрос со сравнением строк в классе где - PullRequest
0 голосов
/ 24 октября 2011

У меня есть две таблицы, Customers и Products. Клиент может иметь более одного продукта.

Я пытаюсь найти клиентов, у которых нет определенного продукта.

Например, 10 клиентов купили продукты A и B, еще 10 клиентов купили A, B и C. Как я могу найти тех клиентов, у которых нет продукта C?

Ответы [ 2 ]

1 голос
/ 24 октября 2011
select *
FROM customer c
WHERE NOT EXISTS (SELECT 1 from products p 
                  WHERE p.customer_id = c.id)

У вас действительно (как уже предлагали @Tony andrews и @Adrian) должна быть третья таблица для хранения сведений о том, какие клиенты купили какой продукт.

Что-то вроде:

**Customer**
Id
Name
Address
Phone

**Product**
Id
Name
Price

**Customer_Product**
customer_id
product_id

Это означает, что вы удаляете избыточность из таблицы продуктов.Подумайте, что вам нужно сделать, если название продукта изменилось незначительно - вместо обновления нескольких строк (как вы должны были бы сделать сейчас), вам нужно будет обновить только 1 строку, и вам не нужно будет прикасаться кистория транзакций вообще ..

1 голос
/ 24 октября 2011

Для вашей текущей структуры БД это то, что вы ищете:

select c.id, c.name, c.phone, c.address 
from Customers c
where not exists (select * from products p 
                  where p.customer_id = c.id and p.id = 'c') 

Однако вам следует подумать о создании третьей таблицы для хранения отдельных покупок.

...