sql-запрос со сравнением строк в классе where

#mysql #sql #oracle #postgresql #firebird

#mysql #sql #Oracle #postgresql #firebird

Вопрос:

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

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

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

Комментарии:

1. Вам нужно будет предоставить свою структуру таблицы. Мы не экстрасенсы!

2. Предположительно, здесь есть как минимум три таблицы: customers (aka клиенты), которые могут покупать вещи, products которые можно купить, и третья таблица, например purchases , показывающая, какие клиенты купили какие продукты. Я прав?

3. Идентификатор клиента имя адрес телефона Идентификатор продукта имя цена customer_id

4. @user1010861 Что вам действительно нужно сделать, так это обновить свой вопрос в соответствии со структурой БД…

5. И добавьте тег «Домашнее задание» (если это домашнее задание). Я предполагаю, что вам тоже не нужен ответ во всех этих СУБД.

Ответ №1:

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

 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') 
 

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

Ответ №2:

 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. привет, ребята, вот как это выглядит: у меня есть 3 таблицы в виде следующих клиентов, продуктов, покупок и, скажем так, у меня есть 3 10 продуктов, я хочу извлечь все записи из базы данных, где у клиентов нет определенного продукта, например select c.name, c.status, c.contact_number from purchases p join clients c on p.cid = c.id where not exists (product_a) , спасибо