2012-02-12 84 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 
)