为什么我的查询不可更新?

MgS*_*Sam 1 ms-access ms-access-2010

我正在尝试在Access中为用户构建可更新的视图.基本上,基础表看起来像这样:

Accounts
--------
accountId
accountName
accountHolder

TransactionStatements
------------
statementId
accountId
received
month
year
Run Code Online (Sandbox Code Playgroud)

用户想要一个如下所示的Query(view):

StatementView
-------------
accountName
accountHolder
year
janReceived
febReceived
marReceived
etc...
Run Code Online (Sandbox Code Playgroud)

使用转置实现此目的的SQL非常简单,但生成的视图不可更新.

我也试过明确地做多个连接来完成这个:

PARAMETERS [Enter Year:] Long;
SELECT accountName, accountHolder, year, 
FROM ((Accounts a
INNER JOIN TransactionStatements ts1 ON a.accountID = ts.accountID) 'AND month = 1 (This isn't allowed for some reason?)
INNER JOIN TransactionStatements ts2 ON a.accountID = ts.accountID) 'AND month = 2 (This isn't allowed for some reason?)
WHERE ts1.month = 1 AND ts2.month = 2 AND ts1.year = ([Enter Year:]) AND ts2.year = ([Enter Year:])
Run Code Online (Sandbox Code Playgroud)

但是,只要我添加第二个INNER JOIN,结果就会再次变为不可更新.我看过这个MS帮助页面,但它没有帮助我找到正确的方法来做到这一点.

它建议使用Forms作为替代方案,但在Access中构建自定义表单似乎比编写视图更加神秘和复杂.

有什么建议?

Joh*_*nes 20

看看为什么记录集不可更新的这个非常全面的原因列表:

当记录集始终可更新时

在以下情况下,记录集始终可更新:

  1. 它基于单个表格.
  2. 它基于基于单个表的查询.
  3. 它基于基于具有一对一关系的表的查询.

当记录集永远不可更新时

在以下情况下,记录集永远不可更新:

  1. 它基于交叉表查询.
  2. 它基于Union Query.
  3. 它是一个聚合查询,用于计算字段中值的总和,平均值,计数或其他类型的总计.
  4. 它是一个更新查询,它引用交叉表查询,选择查询或包含总计或聚合函数的子查询的"更新到"行中的字段 注意:通过在更新查询的"更新到"行中使用域聚合函数,可以引用交叉表查询,选择查询或包含总计或聚合函数的子查询中的字段.
  5. 它基于一个Query,其中包含一个没有唯一索引的链接ODBC表.
  6. 数据库以只读方式打开或位于只读驱动器上.
  7. 它是一个SQL传递查询.
  8. 它是UniqueValues属性设置为Yes的查询.(也就是说,它是一个带有DISTINCT谓词的查询.)
  9. 笛卡尔连接(即包含多个表或查询的查询,以及表或查询在"设计"视图中未通过连接线连接.)
  10. 基于三个或更多表的查询,其中存在多对一对多关系.注意:虽然您无法直接更新查询中的数据,但如果表单的RecordsetType属性设置为Dynaset(Inconsistent Updates),则可以根据查询更新表单或数据访问页中的数据.
  11. 计算字段.即使查询本身是可更新的,如果查询中的列基于公式,也无法更新该字段.但是,如果更新公式中的其他字段,则计算字段将自动更新.

记录集在某些条件下可更新

某些查询,特别是那些涉及Join的查询,在某些情况下不会更新,但会在其他条件下更新.在其他查询中,即使查询本身是可更新的,也不会有一些字段.以下是查询问题及其相应解决方案的案例.

  1. 基于没有关系的表的连接进行查询.

    •问题:如果查询基于两个或多个未建立关系的表(启用了参照完整性),则查询将不可更新.

    •解决方案:在"单侧"表上的"加入"中使用的所有字段上创建主键或唯一索引.需要说明的是,这意味着基于所有字段的一个主键或唯一索引,而不是每个字段上的单独索引.在基于具有一对多关系(1:M)的表的连接的查询中,您可能无法在一个或多个字段中编辑数据.

  2. 从"一"方加入字段

    •问题:如果在两个表之间创建了1:M关系,则无法更改关系"one"侧表的主键字段(在Join中使用).

    •解决方案:在两个表之间启用级联更新.

  3. 如果"许多"侧连接字段未出现在数据表中,则新记录

    •问题:在基于1:M关系的查询中,您可以创建新记录并填写来自"一个"边表的字段,但是如果"很多"边表中的连接字段不可见在查询(即外键)中,您无法将数据添加到"多个"字段.

    •解决方案:将"多"边表(即外键)中的连接字段添加到查询中以允许添加新记录.

  4. "一"侧的新记录与其他"一"侧记录重复.

    •问题:添加新记录时,如果尝试键入"一个"侧字段,则将尝试创建新记录.即使您使用相同的主键值,也会出现错误.

    •解决方案:将值添加到与已存在记录的"一"侧连接字段(主键)匹配的"多"侧连接字段(外键).只会出现"一"侧值.

  5. 在"一"侧更新数据后,从"多"方加入字段

    •问题:如果您当前正在编辑关系"一"侧的字段,则无法更改"多"侧连接字段(外键).

    •解决方案:保存记录; 然后你就可以对"多"侧连接字段进行更改.

  6. 如果未输出ODBC表的完整唯一键,则为新记录

    •问题:这与Never Updateable下的#5不同.在这种情况下,链接的ODBC表的主键存在,但不会添加到查询中.

    •解决方案:选择ODBC表的所有主键字段以允许插入它们.

  7. 查询没有更新数据权限

    •问题:未授予更新数据权限的查询(或基础表).

    •解决方案:要修改数据,必须分配权限.

  8. 查询没有删除数据权限

    •问题:未授予"删除数据"权限的查询(或基础表)

    •解决方案:要删除数据,必须分配权限.结论

不可更新记录集的原因是多种多样的.有些人有解决方案,有些则没有.希望这份清单可以帮助您了解其中的差异.

以上是从以下博客中逐字逐句采取的:此记录集不可更新.为什么? 我认为最好复制并完全归因而不是试图解释,以便提供所有信息.

我建议你看看的第一件事可能是你的表有适当的索引,并且他们的关系设置正确.这些通常是我首先提出的两件事,他们倾向于解决我自己的大多数"不可更新的查询"问题.