如何在 Access 查询中选择前 1 - 并实际让它工作

Posted

技术标签:

【中文标题】如何在 Access 查询中选择前 1 - 并实际让它工作【英文标题】:How to select top 1 in Access query - and actually get it to work 【发布时间】:2016-12-22 16:54:34 【问题描述】:

首先让我指出,这是多个堆栈溢出问题的重复,所有问题都有答案 - 但没有一个能解决我的问题

例如 - 这两个: Access join on first record 和 How to select top 10 in Access query?


我的问题应该很简单 - 但是 - 显而易见的答案不起作用。

我有两张桌子。客户和交易。

我想返回包含最后销售日期的客户列表。 简单对吧…… 为客户选择列,然后为销售日期执行一个子查询,将退货限制为 1 件。

SELECT 
[Client].[LastName] as C1,
[Client].[FirstName] as C2,
(SELECT TOP 1 Transactions.SaleDate FROM Transactions WHERE Transactions.ClientID=Client.ClientID  ORDER BY Transactions.SaleDate Desc) as C3,
[Client].[ClientID] as C4
FROM [Client]

但是访问告诉我子查询有这个问题: "这个子查询最多可以返回一条记录。"

啊...但是堆栈溢出有一个答案 “这个子查询最多可以返回一条记录。”错误。

--->“您的子查询返回了多个结果。” "尝试使用 select top 1 修复数据"

At most one record can be returned by this subquery. (Error 3354)

嗯……很好。

SQL 中是否还有其他内容可能会令我完全遗漏而感到困惑?

【问题讨论】:

也许你可以使用DMax("SaleDate", "Transactions", "ClientID=" & ClientID) AS C3而不是子查询 添加那个作为JOIN试试吧,Access sql解析可能会被破坏(一直在那里),试试这个: 【参考方案1】:

将其添加为JOIN并尝试一下,Access sql解析可能会被破坏(曾经在那里),试试这个:

SELECT 
    c.[LastName] as C1,
    c.[FirstName] as C2,
    sd.maxsaledate as C3,
    c.[ClientID] as C4
FROM 
    [Client] c
    left join (
      select clientid, max(SaleDate) as maxsaledate from transactions group by clientid
    ) sd on
    c.ClientID = sd.ClientID

【讨论】:

那行得通。但是 - 我必须在“max(SaleDate)”和“maxsaledate”之间添加“as”,因此您可能需要为未来的搜索者编辑您的答案。【参考方案2】:

实际上,如果您希望前 1 个起作用并且只强制一个记录,那么在唯一的列上添加 order by。

这样就可以了。

SELECT 
 [Client].[LastName] as C1,
 [Client].[FirstName] as C2,
(SELECT TOP 1 Transactions.SaleDate FROM Transactions WHERE
Transactions.ClientID=Client.ClientID  ORDER BY Transactions.SaleDate Desc,
  ID) as C3,
  [Client].[ClientID] as C4
  FROM [Client]

因此,在唯一列(自动编号 id)的 orderby 中简单添加一列将始终导致只有一行。并且您的查询可能会比使用 max() 执行得更好。

【讨论】:

以上是关于如何在 Access 查询中选择前 1 - 并实际让它工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Access 2010 的选择查询中创建自动增量字段?

如何在 MS Access 2010 中组合多种查询类型?

如何在 Excel 中使用带查询的 Access 数据库作为数据透视表

access 不能建立删除查询。

Access查询中按不同列功能选择列

如何在 MS Access 2007 中使用查询作为报告源?