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

时间:2016-12-22 16:54:35

标签: sql ms-access subquery

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

例如 - 这两个: Access join on first recordHow 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中还有其他东西可能让我感到困惑,我完全错过了吗?

2 个答案:

答案 0 :(得分:2)

将其添加为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

答案 1 :(得分:1)

实际上,如果您希望前1个工作并且只需要FORCE一个记录,那么在一个唯一的列上添加一个订单。

所以这会奏效。

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]

因此,按照唯一列(autonumber id)的顺序添加列将因此总是只产生一行。您可能会使用max()来执行更好的查询。