根据发票项目退货发票(INNER JOIN)

时间:2019-05-28 19:39:48

标签: tsql

我在SQL Server中有2个表:Invoice和InvoiceItem。这两个表都有一个InvoiceID列,InvoiceItem表有一个ItemID列。

我需要的是一个查询,如果InvoiceItems完全指定了ItemID,我可以运行该查询以返回发票。

示例:

Invoice.InvoiceID = 1

InvoiceItem.InvoiceItemID = 1
InvoiceItem.InvoiceID = 1
InvoiceItem.ItemID = 1

InvoiceItem.InvoiceItemID = 2
InvoiceItem.InvoiceID = 1
InvoiceItem.ItemID = 2

我需要查询所有包含2个订单项的发票,一个项目ID为1,一个项目ID为2。

我认为带有“ IN”语句的INNER JOIN可能会使我到达那里,但它返回的不仅仅是一张发票。以下内容返回ItemID为1或2的任何发票。这有点像我想要“和”而不是“ IN”中的“或”。

SELECT InvoiceID FROM Invoice i INNER JOIN InvoiceItem ii ON i.InvoiceID = ii.InvoiceID WHERE ii.ItemID IN (1, 2)

1 个答案:

答案 0 :(得分:0)

  

在IN而不是或

我理解您的意思,但它不起作用,因为您要跨多个行进行思考,就像同一项目的不同实例一样。如果您要查找itemid = 1和itemid = 2的行,那么您将一无所获,因为没有任何一行满足此要求

相反,您可以查看特定发票的整个行集合,并以汇总形式查看它们。您实际上是在说:“我想要明细行数为2,最低ID为1,最高为2的发票ID”-这是“跨多行查看”并选择汇总属性:

@timer('call service xyz')
def xyz():
    ...

注意:

  • 如果InvoiceID,ItemID是唯一的,您可以忽略计数检查
  • 将其放入子查询中,然后在需要时加入“发票”表中

您要求提供可变数量的商品,这是一种技巧:

SELECT InvoiceID 
FROM InvoiceItems 
GROUP BY InvoiceID 
HAVING 
  COUNT(*) = 2 AND 
  MIN(ItemId) = 1 AND 
  MAX(ItemID) = 2

通过将数字转换为2,4或8并指定3个项目,只有一种方法获得14。