我想,我在理解外部联接时遇到了一些问题。这是一个与学校有关的问题;通常我不会在这里问那些,但我似乎无法让它发挥作用。
我有一张桌子Customer
,其中包括customerID
和其他客户信息。我还有一张名为 的表Orders
,其中包括customerID
、买了什么以及有多少。
现在,我只想列出所有没有购买任何东西的客户,(即他们的客户 ID 不在Orders表中。)
你能帮我吗?
我想,我在理解外部联接时遇到了一些问题。这是一个与学校有关的问题;通常我不会在这里问那些,但我似乎无法让它发挥作用。
我有一张桌子Customer
,其中包括customerID
和其他客户信息。我还有一张名为 的表Orders
,其中包括customerID
、买了什么以及有多少。
现在,我只想列出所有没有购买任何东西的客户,(即他们的客户 ID 不在Orders表中。)
你能帮我吗?
SELECT c.*
FROM Customer c
LEFT JOIN Order o USING (customerID)
WHERE o.customerID IS NULL
在这种情况下不需要使用外连接。试试这个
Select * From Customer Where CustomerId not in (Select CustomerId in Order)
根据您拥有的索引,有几种方法可以做到这一点:
外连接
SELECT a.customerid
FROM customer a
LEFT JOIN orders b
ON ( a.customerid = b.customerid )
WHERE b.customerid IS NULL
子集查询
SELECT customerid
FROM customer
WHERE customerid NOT IN (SELECT customerid
FROM orders)
设置差异
SELECT customerid
FROM customer
EXCEPT
SELECT customerid
FROM orders
第一种方法实际上在性能方面可能是最差的,第三种是我认为最简单的方法,但是您无法检索有关客户的其他信息,第二种方法在性能方面可能与第三种相同,但您仍然可以检索其他客户信息。
Select Customer.* From Customer
Left Join Order on Customer.ID = Order.CustomerID
Where Order.CustomerID is Null
基本上,您选择所有客户,无论他们是否有订单(直接外连接),然后使用 where 过滤掉所有订购了东西的客户。
尝试上面有和没有 where 子句的方法,你会看到的。
PS 不要使用关键字作为表名,这使得编写查询成为 PIA。