首先让我指出,这是多个堆栈溢出问题的重复,这些问题都有答案 - 但它们都没有解决我的问题
例如 - 这两个: 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中还有其他东西可能让我感到困惑,我完全错过了吗?
答案 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()来执行更好的查询。