Mysql Query: поиск клиентов с заказами, но без оплаты - PullRequest
1 голос
/ 12 февраля 2012

Как видно из названия, я пытаюсь найти клиентов, которые сделали заказы, но еще не сделали платежи.

У меня есть три стола;

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 ]

2 голосов
/ 12 февраля 2012

Это должно вернуть клиентов, у которых есть заказы, но нет соответствующих платежей, при условии, что все ключи, к которым вы присоединились в исходном примере, были правильными (например, 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;
1 голос
/ 12 февраля 2012

В основном вы пропустили предложение 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.

Надеюсь, это поможет.

0 голосов
/ 12 февраля 2012

В отличие от других решений, это решение не будет создавать дубликаты номеров клиентов, когда у клиентов более одного заказа.

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