我有以下3个陈述,
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)
select OrderNumber from Orders where OrderNumber = 987654
select OrderNumber from InvoiceControl where OrderNumber = 987654
这3个查询在其他方案中与其他表有关,但不是这个,我在任何地方都犯了明显错误吗?下面是查询运行和输出:
这背后的想法是根据Orders Tabl中的OrderNumbers找到InvoiceControl中不存在的OrderNumbers,因此top查询还将返回值987654,因为此值尚未包含在InvoiceControl中此表可能是没有发票的新订单
答案 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