如何通过"At most one record can be returned by this subquery"工作



通过我所做的所有研究,我很难理解这个错误。我有以下查询

SELECT M.[PO Concatenate], Sum(M.SumofAward) AS TotalAward, (SELECT TOP 1 M1.[Material Group] FROM 
[MGETCpreMG] AS M1 WHERE M1.[PO Concatenate]=M.[PO Concatenate] ORDER BY M1.SumofAward DESC) AS TopGroup
FROM MGETCpreMG AS M
GROUP BY M.[PO Concatenate];

对于一个简短的例子,它审查我想要的结果,但随后出现"此子查询最多可以返回一条记录"错误并将所有数据擦除到 #Name?

对于上下文,[MGETCpreMG] 是对主表 [MG ETC] 的查询,用于合并 PO 事务([PO 连接](上不同物料组的奖励

SELECT [MG ETC].[PO Concatenate], Sum([MG ETC].Award) AS SumOfAward, [MG ETC].[Material Group]
FROM [MG ETC]
GROUP BY [MG ETC].[PO Concatenate], [MG ETC].[Material Group]
ORDER BY [MG ETC].[PO Concatenate];

我认为原因在于我无法理解如何使用子查询。

在查询可以返回多个值的情况下?只需添加附加排序依据即可。

因此,一个常见的子查询可能是获取最后一张发票。因此,您可能有:

select ID, CompanyName,
(SELECT TOP 1 InvoiceDate from tblInvoice 
where tblInvoice.CustomerID = tblCompany.ID
Order by InvoiceDate DESC)
As LastInvoiceDate
From tblCustomers

现在上述方法可能会工作一段时间,但随后它会爆炸,因为您可能在同一天有两张发票!

因此,您所要做的就是按子句添加额外的顺序 - 在子表的PK上说:

Order by InvoiceDate DESC,ID DESC)

因此,前 1 名将遵循您添加的"额外"订单列,因此只返回一行 - 即使有多个值与前 1 列匹配。

我想在上面我们也许可以忘记发票日期并始终采用最上面的最后一个自动编号 ID,但对于很多查询,您不能总是确定 - 可能是我们想要最后一个最昂贵的发票金额。同样,如果两个大发票金额的最大值(顶部(相同,则可以再次返回两行。因此,只需添加额外的 ORDER BY 子句,其中包含进一步对数据进行排序的第二列。因此,前 1 名只会拉取第一个值。您的顶级组示例就是这样一个例子。只需通过"ID"或任何自动编号 ID 列附加额外的订单即可。

相关内容

最新更新