0

我有一个要解决的 SQL 问题。我知道答案很简单,但我就是做错了。我有两张桌子,一张是顾客,另一张是订单。这两个表使用 customer_id 连接。问题是列出所有没有下订单的客户!问题是要在 GIS 桌面软件 MapInfo Professional 中运行,因此并非每个 SQL 命令都适用于该程序。换句话说,如果我得到解决该问题的更多方法,我将不胜感激。

以下是我的想法:

SELECT customer_id 
from customers
WHERE order_id not in (select order_id from order) 
   and customer.customer_id = order.customer_id
4

4 回答 4

2

这个怎么样:

SELECT * from customers
WHERE customer_id not in (select customer_id from order)

逻辑是,如果订单中没有 customer_id,则意味着客户从未下过订单。正如您所提到的 customer_id 是公共键,因此上面的查询应该获取所需的结果。

于 2013-06-23T14:12:22.897 回答
0
SELECT c.customer_id 
FROM customers c
LEFT JOIN orders o ON (o.customer_id = c.customer_id)
WHERE o.order_id IS NULL
于 2013-06-23T14:12:24.153 回答
0

您的方法存在一些问题:

  1. 客户表中可能没有 order_id,但在您的 where 语句中您引用它
  2. where-statement (order.customer_id) 中的别名(或表名)顺序未知,因为其中没有 join 语句
  3. 如果有加入,您将过滤掉所有没有订单的客户,这与您想要的完全相反

你的问题很难回答我,因为我不知道 MapInfo GIS 理解哪个 SQL 子集,但让我们试试:

select * from customers c where not exists (select * from order o where o.customer_id=c.customer_id)
于 2013-06-23T14:21:48.843 回答
0

... The NOT EXISITS way:

SELECT * FROM customers
WHERE NOT EXISTS ( 
  SELECT * FROM orders
  WHERE orders.customer_id = customer.customer_id
)
于 2013-06-23T14:16:50.510 回答