【问题标题】:How to work past "At most one record can be returned by this subquery"如何解决“此子查询最多可以返回一条记录”
【发布时间】:2020-10-08 20:05:04
【问题描述】:

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

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 Concatenate])

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 [PO Concatenate] FROM [MGETCpreMG] GROUP BY [PO Concatenate] HAVING COUNT(*) > 1
  • @shawnt00 我已经浏览了您的链接和 Allen's Browne 的网站,但仍然找不到解决问题的方法。您的最新代码确实帮助我识别有问题的匹配,但由于我的数据集的性质,将重复 PO Concatenates。也许我将不得不使用没有重复的 PO Concatenate 的不同表/查询

标签: sql ms-access subquery


【解决方案1】:

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

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

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

现在上述方法可能会奏效一段时间,但随后会崩溃,因为您可能在同一天有两张发票!

因此,您所要做的就是添加额外的 order by 子句 - 比如在子表的 PK 上,如下所示:

   Order by InvoiceDate DESC,ID DESC)

因此,前 1 将尊重您添加的“附加”顺序列,因此只会返回一行 - 即使有多个值与前 1 列匹配。

我想在上面我们可能会忘记 invoiceDate 并且总是取最后一个自动编号 ID,但是对于很多查询,您不能总是确定 - 我们可能想要最后一个最昂贵的发票金额.同样,如果两个大发票金额的最大值(顶部)相同,则可以再次返回两行。因此,只需添加额外的 ORDER BY 子句和第二列,进一步对数据进行排序。因此 top 1 只会拉出第一个值。你的顶级群体的例子就是这样一个例子。只需通过“ID”或任何自动编号 ID 列添加额外订单即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多