Tsql 基于发票项目返回发票(内部联接)

Tsql 基于发票项目返回发票(内部联接),tsql,Tsql,我在SQL Server中有两个表:Invoice和InvoiceItem。两个表都有一个InvoiceID列,InvoiceItem表有一个ItemID列 我需要的是一个查询,如果InvoiceItems具有指定的ItemID,我可以运行该查询返回发票 例如: Invoice.InvoiceID = 1 InvoiceItem.InvoiceItemID = 1 InvoiceItem.InvoiceID = 1 InvoiceItem.ItemID = 1 InvoiceItem.Inv

我在SQL Server中有两个表: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”语句的内部连接可能会让我达到目的,但它返回的不仅仅是一张发票。下面返回ItemID为1或2的任何发票。这有点像我想要一个“and”而不是“in”中的“or”

而不是在

我理解你的意思,但它不起作用,因为你在考虑多行,这就像是同一类项目的不同实例。如果您正在查找itemid=1和itemid=2的行,您将永远不会得到任何结果,因为没有一行满足此条件

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

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

  • 如果InvoiceID、ItemID是唯一的,则可以忽略计数检查
  • 如果您想从中获取信息,请将其放入子查询并随后加入发票表
您要求任何数量的物品,这里有一个技巧:

SELECT InvoiceID 
FROM InvoiceItems 
GROUP BY InvoiceID 
HAVING 
  SUM(CASE ItemID 
    WHEN 9 THEN 2 
    WHEN 38 THEN 4 
    WHEN 483 THEN 8 
    ELSE 1 END
  ) = 14 AND 
  COUNT(*) = 3
通过将数字转换为2、4或8并指定3项,只有一种方法可以达到14

而不是在

我理解你的意思,但它不起作用,因为你在考虑多行,这就像是同一类项目的不同实例。如果您正在查找itemid=1和itemid=2的行,您将永远不会得到任何结果,因为没有一行满足此条件

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

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

  • 如果InvoiceID、ItemID是唯一的,则可以忽略计数检查
  • 如果您想从中获取信息,请将其放入子查询并随后加入发票表
您要求任何数量的物品,这里有一个技巧:

SELECT InvoiceID 
FROM InvoiceItems 
GROUP BY InvoiceID 
HAVING 
  SUM(CASE ItemID 
    WHEN 9 THEN 2 
    WHEN 38 THEN 4 
    WHEN 483 THEN 8 
    ELSE 1 END
  ) = 14 AND 
  COUNT(*) = 3

通过将数字转换为2、4或8并指定3个项目,只有一种方法可以达到14..

这假设始终有2个项目行,项目ID为1和2。这只是我的例子。如果所需的itemid是9、38和483呢?换句话说,一个可变数量的项目和各种ID。您的“示例”看起来像一个规范。。我将做一个editThis假设总是有两行条目,条目ID为1和2。这只是我的例子。如果所需的itemid是9、38和483呢?换句话说,一个可变数量的项目和各种ID。您的“示例”看起来像一个规范。。我来编辑一下