Sql server 仅当使用tsql有一个结果时才包括子选择

Sql server 仅当使用tsql有一个结果时才包括子选择,sql-server,tsql,subquery,Sql Server,Tsql,Subquery,我们有一张发票、一张发票明细表和一张订单表,这些表由发票明细行链接,因为发票明细按交货日期分组,所以发票通常包含多个订单号 现在,我想通过使用某种子选择来构建一个视图,如果发票中只涉及一个订单,那么该视图将显示订单号 我提出了这个方法,但它仍然会生成一个错误,报告子查询返回多个结果 SELECT Invoice.Id, Invoice.TotalAmount, (SELECT DISTINCT OrderId FROM InvoiceDetail WHERE InvoiceDetail.I

我们有一张发票、一张发票明细表和一张订单表,这些表由发票明细行链接,因为发票明细按交货日期分组,所以发票通常包含多个订单号

现在,我想通过使用某种子选择来构建一个视图,如果发票中只涉及一个订单,那么该视图将显示订单号

我提出了这个方法,但它仍然会生成一个错误,报告子查询返回多个结果

SELECT Invoice.Id, Invoice.TotalAmount, 
(SELECT DISTINCT OrderId  FROM InvoiceDetail 
WHERE InvoiceDetail.InvoiceId = Invoice.Id
GROUP BY OrderId HAVING COUNT(DISTICT OrderId) = 1) AS OrderId 
FROM Invoice
有什么办法可以让它工作吗?

测试正确:

SELECT Id, TotalAmount, OrderInfo.OrderId 
  FROM Invoice 
  JOIN
    (
      SELECT InvoiceId, OrderId 
        FROM InvoiceDetail 
        JOIN Invoice  
          ON InvoiceDetail.InvoiceId = Invoice.Id  
       GROUP BY InvoiceId, OrderId
      HAVING COUNT(OrderId)=1
    ) AS OrderInfo
    ON Invoice.Id=OrderInfo.InvoiceId
请注意,缺少DISTINCT in HAVING子句,这是不正确的(它将导致多个订单ID计数为一个,从而破坏预期行为)

如何:

SELECT 
  Invoice.Id,
  Invoice.TotalAmount,
  OneOrder.OrderId
FROM 
  Invoice
  LEFT JOIN (
    SELECT   InvoiceId, MIN(OrderId) OrderId
    FROM     InvoiceDetail 
    GROUP BY InvoiceId
    HAVING   COUNT(DISTINCT OrderId) = 1
  ) OneOrder ON OneOrder.InvoiceId = Invoice.Id

您的问题可能只是
HAVING
子句中的输入错误。请参阅DISTICT.

更改
按医嘱ID分组

GROUP BY InvoiceDetail.InvoiceId

修复原始代码的打字错误:
DISTICT
应该是
不同的
按InvoiceId分组,OrderId
保证满足
计数(OrderId)=1
-但这不是OP要求的,IMHO。如果发票有多个相关订单,此查询将返回具有相同发票编号的多个发票。目标是获得所有发票,但只有订单号是唯一相关的order@jhoefnagels:没错,它将返回多行,但所有行都具有相同的OrderId。如果我理解正确,可以有N个OrderId和一个InvoiceId,他只会对那些只有一个OrderId的文档感兴趣。如果按OrderId分组,我看不出您会如何发现这一点?正如我所说,我用各种场景对此进行了测试,并且它们的行为是正确的(包括0、1、>1个订单,对于特定发票id具有相同的订单id)。如果有人能想到一个不起作用的场景,我很乐意检查它并修改查询。将OrderId放入聚合中是可行的,因为可以在分组子句中忽略OrderId。使用左外部联接使其包含orderid为空值的所有发票,以便为多个订单开具发票。