我在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)
答案 0 :(得分:0)
在IN而不是或
我理解您的意思,但它不起作用,因为您要跨多个行进行思考,就像同一项目的不同实例一样。如果您要查找itemid = 1和itemid = 2的行,那么您将一无所获,因为没有任何一行满足此要求
相反,您可以查看特定发票的整个行集合,并以汇总形式查看它们。您实际上是在说:“我想要明细行数为2,最低ID为1,最高为2的发票ID”-这是“跨多行查看”并选择汇总属性:
@timer('call service xyz')
def xyz():
...
注意:
您要求提供可变数量的商品,这是一种技巧:
SELECT InvoiceID
FROM InvoiceItems
GROUP BY InvoiceID
HAVING
COUNT(*) = 2 AND
MIN(ItemId) = 1 AND
MAX(ItemID) = 2
通过将数字转换为2,4或8并指定3个项目,只有一种方法获得14。