2012-02-12 3 views
1

제목에서 알 수 있듯이, 나는 주문했지만 아직 지불하지 않은 고객의 고객을 찾고있다.mysql 질의 : 고객 W/Orders를 찾지 만 지불하지 않음을 찾는다.

세 개의 테이블이 있습니다.

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

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 

없이

나는 당신의 schema을 제공하지 않았기 때문에이 경우 내가 정확하게 말할 수없는 대신, a.CustomerNumber = b.CustomerNumber

a.CustomerName = b.CustomerNumber에 오타 오류 믿습니다 너의 테이블에 약간 dummy records.

희망이 도움이됩니다.

+0

@warz이 솔루션을 사용해 보셨습니까? 두 번째 것. –

+0

나는 두 번째 해결책을 시도했는데 그것이 가정 한 것입니까? 도움에 대 한 upvote. – Warz

+0

@Warz 기쁜 당신을 도왔습니다. 천만에요. –

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 
) 
관련 문제