SQL Server WHERE NOT EXISTS无法正常工作

时间:2014-11-10 15:07:24

标签: sql sql-server sql-server-2012

我有以下3个陈述,

  1. 选择不存在的订单号
  2. select Orders.OrderNumber 
    FROM Orders 
    inner join InvoiceControl on Orders.OrderNumber = InvoiceControl.OrderNumber 
    where not exists (select OrderNumber from Orders where InvoiceControl.OrderNumber = Orders.OrderNumber)
    
    1. 选择不存在的特定订单号
    2. select OrderNumber from Orders where OrderNumber = 987654
      
      1. 在相应的表中选择不存在的特定订单号
      2. select OrderNumber from InvoiceControl where OrderNumber = 987654
        

        这3个查询在其他方案中与其他表有关,但不是这个,我在任何地方都犯了明显错误吗?下面是查询运行和输出: enter image description here

        这背后的想法是根据Orders Tabl中的OrderNumbers找到InvoiceControl中不存在的OrderNumbers,因此top查询还将返回值987654,因为此值尚未包含在InvoiceControl中此表可能是没有发票的新订单

3 个答案:

答案 0 :(得分:3)

因为您的INNER JOIN已经创建了Orders.OrderNumber = InvoiceControl.OrderNumber之间的所有通讯记录。

在构建此结果集后,您实际上会根据WHERE中的条件过滤掉所有内容。

where not exists (select OrderNumber from Orders where InvoiceControl.OrderNumber = Orders.OrderNumber)

假设,如果您的987654表中只有Orders并且您的InvoiceControl表中有一位记者,那么以下查询,而不是{{1}子句

WHERE

将返回:

select Orders.OrderNumber 
FROM Orders 
inner join InvoiceControl on Orders.OrderNumber = InvoiceControl.OrderNumber 

然后,通过应用您的OrderNumber 987654 条件,您将查找所有没有通讯员的记录(但您已经在两个表之间拥有所有可能的记者,基于您的INNER JOIN)。 / p>

因此,您的结果将是:

where not exists (select OrderNumber from Orders where InvoiceControl.OrderNumber = Orders.OrderNumber)

答案 1 :(得分:0)

在第一个查询中,您首先要求Orders和InvoiceControl中的行(通过FROM和JOIN表),然后在WHERE子句中添加一个请求以排除Orders中存在的所有行。由于您的起始集只包含Orders中的行,如果您要求排除所有这些行,则不会得到任何结果。

答案 2 :(得分:0)

如果您正在寻找的是在tbl Orders中找到所有订单号而不是在tbl InvoiceControl中找到。 然后我会试试这个。

Select O.Ordernumbers from Orders O
Left Join Invoicecontrol I
On O.Ordernumbers = I.Ordernumbers
Where I.Ordernumbers is null