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
)
Другие вопросы по тегам