2015-04-23 78 views
-3

我在查找以下SQL代码:SQL - 未付款的客户

显示尚未付款的客户的订单编号。

注意:有客户,订单和付款表。客户ID不在付款表中。

感谢您的帮助!

+2

你为什么不能做自己?一个特定的问题?您当前的查询出错? –

+0

你有多远? 'SELECT o.orderID FROM orders o'? – spencer7593

+0

我对SQL很陌生,所以我几乎失去了。如果你需要我,我会在这里放些东西,但它可能不对。 –

回答

0

你还没有付出太多的努力。

select id 
    from orders o 
    left join payments p 
     on p.order_id = o.id 
    where p.order_id is null 

假设我有关系吧,这会给你所有的订单已经没有对他们支付的款项。

+0

非常感谢! –

0

听起来像你可以使用反连接模式,例如,

SELECT o.orderID 
    FROM orders o 
    LEFT 
    JOIN payments p 
    ON p.orderID = o.orderID 
WHERE p.orderID IS NULL 

,说从orders获得所有的行,匹配payments一起。如果有orders其中没有匹配的payments,则orders的行将与NULL值一起返回,替代payments中的“缺失”行。 (关键字之前的关键字LEFTJOIN告诉MySQL做一个“外部连接”,即使表中没有匹配的行,也会返回左侧表中的所有行(否则将满足谓词)在右侧)。

的“绝招”是WHERE子句,我们丢弃orderspayments有一个匹配行的任何行的谓语,留给我们orders没有任何匹配payments

还有其他的查询模式可以达到相同的结果,例如, NOT IN (subquery)NOT EXIST (correlated subquery)

例如:

SELECT o.orderID 
    FROM orders o 
    WHERE o.orderID NOT IN 
     (SELECT p.orderID 
      FROM payments p 
      WHERE p.orderID IS NOT NULL 
     ) 

- 或 -

SELECT o.orderID 
    FROM orders o 
    WHERE NOT EXISTS 
     (SELECT 1 
      FROM payments p 
      WHERE p.orderID = o.orderID 
     ) 
+0

我会尽快做到这一点,并张贴我的评论,非常感谢! –

+0

再次感谢您的真正快速反应,并真正教会我一些东西!这是我...'选择Order_t.OrderID FROM Orders_t LEFT JOIN ON Payment_t.OrderID = Order.OrderID WHERE IS Payment_t.OrderID Payments_t NULL' –