SELECT 查询中的 MS Access“此记录集不可更新”
Posted
技术标签:
【中文标题】SELECT 查询中的 MS Access“此记录集不可更新”【英文标题】:MS Access "This recordset is not updatable" in a SELECT query 【发布时间】:2016-07-25 15:35:33 【问题描述】:我对 MS Access 给我的这条消息感到困惑。
我正在尝试运行一个 SELECT 查询,其中包含两个子查询。所有表都是本地的。
谁能解释一下为什么下面的代码会返回这个错误?
SELECT S.SKU, S.Date, S.[Order No], P.WSP, P.Average_Cost, S.[Item Status]
FROM [Item Detail Temp] AS S, [FD Worksheets Temp] AS P
WHERE [P].[SKU]=[S].[SKU] AND [P].[Date to use]=(SELECT MIN(P2.[Date to use])
FROM [FD Worksheets Temp] P2
WHERE P2.[SKU] = S.[SKU]
AND P2.[Date to use] >= S.[Date]);
给它一个谷歌并没有特别帮助。我在安全性中启用了宏以确保它不是,据我所知,我在上面的代码中没有任何可能导致错误的分组?
此外,我相信代码确实可以正常工作,但在加载栏向上的整个过程中,该消息都会显示在屏幕的左下角。它的运行速度也非常慢,而且我确信我过去曾运行过此查询而没有显示该消息,而且速度也比现在快得多。
非常感谢
编辑:多看几眼后,我发现了几个可能的原因:
"- 它在 SELECT 子句中使用 First()、Sum()、Max()、Count() 等。聚合记录的查询是只读的。 - 有一个 MIN() 函数,会不会是它的原因?
- 它在 SELECT 子句中有一个子查询。取消选中子查询下的显示框,或使用域聚合函数。"
- JOIN 中的字段索引不正确:JOINed 字段上没有主键或唯一索引。 没有唯一键字段,这可能是原因吗?
【问题讨论】:
【参考方案1】:JOIN
您的表源并使用域聚合函数DMin
使您的查询可更新。
FROM
[Item Detail Temp] AS S
INNER JOIN [FD Worksheets Temp] AS P
ON [P].[SKU]=[S].[SKU]
WHERE
[P].[Date to use]=
DMin
(
"[Date to use]",
"FD Worksheets Temp",
"[SKU] = " & S.[SKU] & " AND [Date to use] >= " & Format(S.[Date], "\#yyyy-m-d\#")
);
【讨论】:
由于某种原因,我仍然收到一条消息,提示“此记录集不可更新。”。这可能是什么原因造成的?Item Detail Temp
或 FD Worksheets Temp
是查询而不是表?
这可能与我的索引有关吗?添加主键可能会解决这个问题吗?目前,这两个表在 SKU 和 Date 字段上都有一个非唯一索引,但没有一个具有唯一索引。我可以通过组合 SKU 和 [使用日期] 从“FD 工作表”表中创建一个唯一索引,但是在项目“详细信息表”中做同样的事情是行不通的,因为相同的 ID 将被多次出售天。
我在你回复的时候打字……不是两个都是本地表。它们是链接到本地网络上的拆分数据库的表
如果SKU
在一个表中是唯一的,但在另一个表中不唯一(即一对多关系),Access 应该允许您在“多”端编辑表中的字段值.但如果 SKU
在任一表中都不是唯一的,我认为这就是 Access 将您的查询结果视为不可更新的原因。【参考方案2】:
汉斯,我注意到你删除了你的评论。我及时得到了它,而且效果很好。与之前的 5 到 10 分钟相比,现在查询运行时间不到 1 秒。
我使用以下方法进行管理:
SELECT S.SKU, S.Date, S.[Order No], P.WSP, P.Average_Cost, S.[Item Status]
FROM [Item Detail Temp] AS S, [FD Worksheets Temp] AS P
WHERE
[P].[SKU]=[S].[SKU]
AND [P].[Date to use]=
DMin
(
"[Date to use]",
"FD Worksheets Temp",
"[SKU] = " & S.[SKU] & " AND [Date to use] >= " & Format(S.[Date], "\#yyyy-m-d\#")
);
【讨论】:
好吧,是我太急切了。我将使用更正后的。再次感谢汉斯!【参考方案3】:您的查询包含聚合函数MIN
,表应该使用JOIN
子句连接,连接列也应该被索引,详细信息表应该使用具有唯一索引的列连接,通常是主键。
【讨论】:
谢谢谢尔盖。我认为不可能在这些数据集上创建唯一索引。一个表包含当然有重复 ID 的销售额,另一个表是产品价格。产品价格表每天添加大约 50k 条记录,本质上是在整个产品文件中附加“今天”价格。然后,此过程应通过匹配产品 ID 和日期来匹配所有价格与销售额。然而,这些文件只在工作日生成,这是这段代码的来源,否则它将是一个简单的连接。以上是关于SELECT 查询中的 MS Access“此记录集不可更新”的主要内容,如果未能解决你的问题,请参考以下文章