2012-02-12 68 views
1

正如标题所说,我试图找到已下订单但尚未付款的客户。Mysql查询:查找客户W /订单,但没有付款

我有三张表;

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; 

我在第8行得到一个mysql语法错误,但不知道为什么?

回答

2

这应该返回有订单但没有匹配付款的客户,假设您在原始示例中加入的所有关键字都是正确的(例如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; 
+0

你对c.customerName绝对正确,那是一个错字,它应该是c.customerNumber。我正在尝试您的实施 – Warz 2012-02-12 04:32:00

1

基本上你错过了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

@warz,你试过这个解决方案吗?第二个。 – 2012-02-12 04:35:37

+0

我试过你的第二个解决方案,是否它是假设的。 upvote的帮助。 – Warz 2012-02-12 04:37:40

+0

@Warz很高兴我帮你。不用谢。 – 2012-02-12 04:43:24

0

与其他解决方案不同,当客户有多个订单时,此解决方案不会产生重复的客户编号。

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 
)