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 TempFD 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“此记录集不可更新”的主要内容,如果未能解决你的问题,请参考以下文章

查询不会更新子窗体 MS-Access 中的表

MS Access:组合框重新查询

Ms access Select 带有限制选项的查询

在 PHP 中限制 MS Access 中的查询

MS Access 包含查询

Ms Access SQL:如何防止 Select 查询重复