Sqlite3: объединить 3 таблицы, суммируя строки и проверяя, находится ли значение в строке - PullRequest
1 голос
/ 10 января 2020

У меня вопрос по поводу запроса Sqlite3.
Задача состоит только из одного предложения: выбрать все столбцы клиентов, которые купили более 4 раз (> = 5 раз)
в период с 2018-01-01 по 2018- 12-31 и не купил номер продукта 4402

Объяснение всех таблиц базы данных для этого вопроса:

1) Клиент
столбцы: CustomerNum , CustomerName, DateOfBirth, Пол, CustomerAddress, CustomerPhoneNum.

2) Колонки покупки
: ПокупкаNum , PurchaseTime, CustomerNum , ShippingCompanyNum

3) Закупка содержит
столбцы: ПокупкаNum , SupplierNum, ProductNum , Сумма

Я выделил столбцы, которые, по моему мнению, необходимы для решения этого вопроса.

Мой запрос:

SELECT Customer.* FROM Customer INNER JOIN Purchase
on Customer.CustomerNum = Purchase.CustomerNum
INNER JOIN PurchaseContains 
on Purchase.PurchaseNum = PurchaseContains.PurchaseNum

WHERE Purchase.PurchaseTime BETWEEN '2018-01-01' AND '2018-12-31' AND PurchaseContains.ProductNum != 4402

GROUP BY Purchase.CustomerNum
HAVING COUNT(Purchase.PurchaseNum) > 4;

Однако из-за ВНУТРЕННЕГО СОЕДИНЕНИЯ я думаю, что некоторые строки дублируются!
Например, это без внутреннего объединения 'PurchaseContains ':

SELECT Customer.* FROM Customer INNER JOIN Purchase
on Customer.CustomerNum = Purchase.CustomerNum

--COMMENT:
--INNER JOIN PurchaseContains 
--on Purchase.PurchaseNum = PurchaseContains.PurchaseNum

WHERE Purchase.PurchaseTime BETWEEN '2018-01-01' AND '2018-12-31' -- COMMENT: AND PurchaseContains.ProductNum != 4402

GROUP BY Purchase.CustomerNum
HAVING COUNT(Purchase.PurchaseNum) > 4;

И это возвращает только 2 строки. Но теперь он не проверяет, не было ли у человека покупки, которая содержит номер товара 4402 (должен выводиться только 1 человек).

Первый SQL Запрос в этом вопросе возвращает 2078 строк!
Я потерян!
Заранее спасибо!

1 Ответ

0 голосов
/ 10 января 2020

Вы правы в своем диагнозе проблемы. Вы можете использовать NOT EXISTS:

SELECT c.*
FROM Customer c INNER JOIN
     Purchase p
     ON c.CustomerNum = p.CustomerNum
WHERE p.PurchaseTime BETWEEN '2018-01-01' AND '2018-12-31' AND
      NOT EXISTS (SELECT 1
                  FROM PurchaseContains pc
                  WHERE pc.PurchaseNum = p.PurchaseNum AND
                        pc.ProductNum = 4402
                 )
GROUP BY p.CustomerNum
HAVING COUNT(p.PurchaseNum) > 4;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...