2012-09-16 64 views
0

我想,理解外部联接有点困难。这是一个与学校有关的问题;通常我不会问这里的人,但我似乎无法让它工作。外部联接问题

我有一个表Customer,其中包括customerID,和其他客户的信息。 我也有一个名为Orders的表,其中包括customerID,买了什么,以及有多少。现在

,我只是想列出谁没有买过东西的所有客户,(也就是说,他们的客户ID不在订单表。)

你能帮忙吗?

+1

[你尝试过什么?](http://whathaveyoutried.com/) – eggyal

+0

您可以使用外连接来回答这个问题,但我通常觉得在列出所有的客户表,其发现客户的条款ID为'NOT IN',在订单表中找到的客户ID列表中。这是在问题中说明的 - 您应该知道(或了解)关键字IN。 –

+0

外连接语句会是什么样子?因为我的SELECT * FROM Customer LEFT OUTER JOIN Order.customerID ON Customer.customerID显然是错的 – Snowflow

回答

1

取决于你有指标,有办法很少做到这一点:

OUTER JOIN

SELECT a.customerid 
FROM customer a 
     LEFT JOIN orders b 
       ON (a.customerid = b.customerid) 
WHERE b.customerid IS NULL 

子集QUERY

SELECT customerid 
FROM customer 
WHERE customerid NOT IN (SELECT customerid 
          FROM orders) 

差集

SELECT customerid 
FROM customer 
EXCEPT 
SELECT customerid 
FROM orders 

第一种方法实际上可能是最坏的在性能方面,第三个是我觉得最简单的,但你不能获得关于客户的其他信息,第二个可能是一样的第三在性能方面,而且还可以检索额外的客户信息。

+0

差集一不工作对我来说似乎 – Snowflow

+0

你能描述的结果你? – WojtusJ

+0

我学会了设置差异在mysql中不起作用:) – Snowflow

2
SELECT c.* 
FROM Customer c 
LEFT JOIN Order o USING (customerID) 
WHERE o.customerID IS NULL 
2

在这种情况下不需要使用外连接。试试这个

Select * From Customer Where CustomerId not in (Select CustomerId in Order) 
+0

但是为了学习的目的,如何使用它来做同样的事情? – Snowflow

+0

@Snowflow,比你应该尝试nosid的答案。他给出的答案与LEFT JOIN它也被称为左外实现这个连接 –

1
Select Customer.* From Customer 
Left Join Order on Customer.ID = Order.CustomerID 
Where Order.CustomerID is Null 

基本上可以选择所有的客户他们是否有一个订单或不(直接外连接),然后使用其中过滤掉所有那些已经订购了一些东西。

试试上面的使用和不使用WHERE子句,你会看到它。作为表名,使编写查询一个PIA

PS不使用关键字。