Mysql Query: поиск клиентов с заказами, но без оплаты
Как видно из названия, я пытаюсь найти клиентов, которые сделали заказы, но еще не сделали платежи.
У меня есть три стола;
Customers, Payments, Orders
SQL, который у меня есть, дает мне (вложенный запрос) всех клиентов без платежей, внешний запрос затем пытается объединить всех клиентов с заказами и проверяет, нет ли этих клиентов в моей внутренней таблице?
SELECT customerWOpayments.customerNumber FROM
ClassicModels.Customers c
INNER JOIN ClassicModels.Orders o ON c.customerName = o.customerNumber
NOT IN
(SELECT distinct c.customerNumber
FROM ClassicModels.Customers c
LEFT OUTER JOIN ClassicModels.Payments p ON c.customerNumber = p.customerNumber
WHERE p.customerNumber IS NULL) customerWOpayments;
Я получаю ошибку синтаксиса MySQL в строке 8, но не могу понять, почему?
3 ответа
Это должно вернуть клиентов, у которых есть заказы, но нет соответствующих платежей, при условии, что все ключи, к которым вы присоединились в исходном примере, были правильными (например, c.customerName = o.customerNumber кажется подозрительным).
SELECT c.customerNumber
FROM ClassicModels.Customers c
INNER JOIN ClassicModels.Orders o
ON c.customerNumber = o.customerNumber
LEFT OUTER JOIN ClassicModels.Payments p
ON c.customerNumber = p.customerNumber
WHERE p.customerNumber IS NULL;
В основном вы пропустили WHERE
пункт. И ваш вопрос не хватает информации. Пожалуйста, предоставьте Schema
из ваших столов. Спасибо!
Попробуй это:
Вы уверены, что с этим условием ON c.customerName = o.customerNumber
?
SELECT customerWOpayments.customerNumber
FROM ClassicModels.Customers c INNER JOIN ClassicModels.Orders o
ON c.customerName = o.customerNumber -- Please check this out
WHERE o.customerNumber NOT IN
(SELECT distinct c.customerNumber
FROM ClassicModels.Customers c LEFT JOIN ClassicModels.Payments p
ON c.customerNumber = p.customerNumber
WHERE p.customerNumber IS NULL);
ИЛИ без подзапроса
SELECT a.*
FROM Customers a INNER JOIN Orders b ON
a.CustomerName = b.CustomerNumber -- Please check this line
LEFT JOIN Payments c ON
b.CustomerNumber = c.CustomerNumber
WHERE c.CustomerNumber IS NULL
Я считаю, что это опечатка на a.CustomerName = b.CustomerNumber
вместо a.CustomerNumber = b.CustomerNumber
Я не могу точно сказать, если это потому, что вы не предоставили schema
из ваших столов с некоторыми dummy records
,
Надеюсь это поможет.
В отличие от других решений, это решение не будет создавать дубликаты номеров клиентов, когда у клиентов более одного заказа.
SELECT C.customerNumber
FROM ClassicModels.Customers C
WHERE
EXISTS(
-- customer has orders
SELECT *
FROM ClassicModels.Orders AS O
WHERE O.customerNumber = C.customerNumber
)
AND NOT EXISTS(
-- customer does not have payments
SELECT *
FROM ClassicModels.Payments P
WHERE P.customerNumber = C.customerNumber
)