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为空值的所有发票,以便为多个订单开具发票。