使用SqlServer,其中*不存在

时间:2017-02-24 06:55:51

标签: sql sql-server

我有两个表,有两列作为orderid和customerid的订单,以及有两列作为customerid和location的客户。

我想要做的是找到表中没有订单的客户中的所有客户ID。例如,Customers.customerid = {A,B,C,D},Orders.customerid = {A,B,C},猜测我需要做的只是从客户那里获得但不存在于订单中。为实现这一目标,我说,

select customerid from Customers where customerid not exists (select customerid from Orders)

但它什么也没有返回..我的逻辑非常简单,首先在表Orders中获取所有customerid,然后从表Orders中获取customerIds中不存在的那些。我不明白为什么这是错的..

我稍后试过,它有效。愿任何人都可以帮助我吗?

select customerid from Customers as c where customerid not exists(select customerid from orders as o where c.customerid = o.customerid)

为什么我要添加c.customerid = o.customerid?

4 个答案:

答案 0 :(得分:1)

  

为什么我必须添加c.customerid = o.customerid?

因为您在数据库中为两列使用相同的名称,这并不意味着在它们之间强制执行或假设任何特定关系。

您需要添加customerid以指定您对这两列相等的特定条件感兴趣。

但语言也允许允许任何其他相关条件。例如。你可以写一个查询:

{{1}}

如果考虑按其{{1}}值排序的客户(不是这是编写此查询的最佳方式,它只是一个灵活性的演示),那么会找到“第一”客户

你的第一个查询实际上是“给我所有行来自Customer表,只要订单表中不存在任何行” - 这也是一个非常有效的要求,但不是你想要的 - 您打算执行某种形式的关联,这是您在第二次查询中所做的。

答案 1 :(得分:0)

Try below query :

SELECT customerid from Customers C WHERE NOT EXISTS 
(
  SELECT 1 FROM orders O WHERE C.customerid = O.customerid
)

答案 2 :(得分:0)

@Damien_The_Unbeliever给出了正确的解释,你需要尝试这样的

我为2个表创建了一些数据

CREATE TABLE #Orders
    (orderid varchar(10), customerid varchar(10))
insert into #Orders values
('venkat','a'),
('raj','b'),
('mahes','c')

CREATE TABLE #Customers
    (customerid varchar(10), [location] varchar(10))
insert into #Customers values
('a','and'),
('b','bar'),
('c','board'),
('D','board1')


SELECT cu.customerid from #Customers CU WHERE NOT EXISTS 
    (
      SELECT 1 FROM #orders b WHERE Cu.customerid = b.customerid
    )

输出

customerid
D

答案 3 :(得分:0)

你需要的是

select c.customerid from customer c inner join order o on c.customerid = o.customerid where c.customerid not in (select od.customerid from order od)

您无法加入,无法访问2个表的数据。