如何在 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 的选择查询中创建自动增量字段?