Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何选择Access查询中的前1个-并实际使其工作_Sql_Ms Access_Subquery - Fatal编程技术网

Sql 如何选择Access查询中的前1个-并实际使其工作

Sql 如何选择Access查询中的前1个-并实际使其工作,sql,ms-access,subquery,Sql,Ms Access,Subquery,首先让我指出,这是多个堆栈溢出问题的重复,所有这些问题都有答案,但没有一个解决了我的问题 例如,这两个: 和 我的问题应该很简单——但是——显而易见的答案不起作用 我有两张桌子。客户和交易 我想返回一份带有上次销售日期的客户名单。 简单,对。。。。 为客户选择列,然后为销售日期执行子查询,将退货限制为1项 SELECT [Client].[LastName] as C1, [Client].[FirstName] as C2, (SELECT TOP 1 Transactions.Sale

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

例如,这两个: 和


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

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

我想返回一份带有上次销售日期的客户名单。 简单,对。。。。 为客户选择列,然后为销售日期执行子查询,将退货限制为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]
但是access告诉我子查询存在以下问题: “此子查询最多可以返回一条记录。”

啊。。。但是堆栈溢出解决了这个问题 “此子查询最多可以返回一条记录。”错误

--->“您的子查询返回多个结果。” “尝试使用“选择顶部1”修复数据”

嗯。。。太好了


SQL中还有什么东西可能会使它混淆,而我完全丢失了它吗?

将其添加为一个连接并尝试它,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

将其添加为连接并尝试,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条生效并只强制执行一条记录,则在唯一的列上添加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()执行得更好。

事实上,如果您希望前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()执行得更好。

也许您可以使用
DMax(“SaleDate”、“Transactions”、“ClientID=“&ClientID”)作为C3
将其添加为一个连接并尝试,Access sql解析可能会中断(在那里),尝试以下操作:您可以使用
DMax(“SaleDate”)代替子查询,“Transactions”,“ClientID=“&ClientID”)作为C3添加该连接并尝试,Access sql解析可能会中断(在那里),尝试以下方法:成功。然而,我不得不在“max(SaleDate)”和“maxsaledate”之间加上“as”,所以你可能想为将来的搜索者编辑你的答案。这很有效。然而,我必须在“max(SaleDate)”和“maxsaledate”之间添加“as”,因此您可能需要编辑您的答案,以供将来的搜索者使用。