15

我有一个选择查询,它执行一些文本操作以基本上重新格式化一个字段,以便我可以在另一个表中查找它:

如果我的第一个表有一个像“J1/2”这样的字段,它会在不同的表中查找记录的 ID,其中 J1 和 J2 在相应的字段中。

这一切都很好。

现在我想更新原始表,因此我不必再使用此字符串操作进行查找,但我对更新查询的尝试以“操作必须使用可更新查询”结尾

有任何想法吗?

我的 SELECT 语句:

SELECT DISTINCT
t1.DD,
t1.TN,
t1.DD & " J" & MID(t1.TN,2,1) AS CalculatedStart,
t1.DD & " J" & MID(t1.TN,4,1) AS CalculatedEnd,
t2.ID
FROM t1 INNER JOIN t2
ON (t1.DD & " J" & MID(t1.TN,2,1)=t2.StartLink)
AND (t1.DD & " J" & MID(t1.TN,4,1)=t2.EndLink)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";

回想一下——这很好用,我从另一端得到了必要的 t2.ID。

所以我想做类似的事情:

UPDATE t1 SET t2ID = (
    SELECT Query1.ID
    FROM Query1
    WHERE t1.DD=Query1.DD
    AND t1.TN=Query1.TN
    )
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";

只有这个失败。这是在 MS Access 本身内,所以我无法想象像大多数“操作必须使用可更新查询”问题那样的实际权限问题。

编辑:试图简化不起作用的情况。

这个 UPDATE 查询很好:

UPDATE t1
SET t2ID="Unknown"
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";

这个失败了(感谢 Goedke——这个例子显然失败了,因为子查询返回了 1 个以上的结果。我过于简单地试图找到我的问题)

UPDATE t1
SET t2ID=(SELECT ID FROM t2)
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";

那么我只是在某种程度上让我的子查询语法错误吗?

编辑:这个 SELECT 语句也很好:

SELECT t1.OA, t1.DD, t1.TN, t1.HATRIS,
    query1.DD, query1.TN, query1.ID
FROM t1 INNER JOIN query1
ON t1.DD=query1.DD
AND t1.TN=query1.TN

此外,在上面的 select 语句中使用 count 表明每个 (DD,TN) 组合恰好返回 1 个 ID

编辑:

我现在要做的最简单的情况——使用各种 SELECT 语句,我现在有一个只有 2 列的表——t1 的主键和我想要插入到 t1 中的值。

好像还是写不出来

UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1)

其中 t1 的主键是 f1。即使添加 WHERE t1.f1 IN (SELECT f1 FROM t2) 也无济于事。(添加以消除子查询返回0结果的可能性)

4

8 回答 8

17

我必须权衡 David W. Fenton 对 OP 的评论。

这是 Jet/ACE 非常烦人的问题。但请尝试:

  1. 转到查询属性(单击显示表格的窗格的背景)并将“唯一记录”设置为“是”
  2. 选项 1 相当于 在子句中添加看起来有些奇怪的DISTINCTROW关键字 ,例如SELECT

UPDATE DISTINCTROW tblClient 
       INNER JOIN qryICMSClientCMFinite 
          ON tblClient.ClientID = qryICMSClientCMFinite.ClientID
   SET tblClient.ClientCMType = "F";

这解决了许多涉及此错误消息的问题,这几乎是荒谬的。

简而言之,这就是 MS Access - 如果您不知道问题 x 的商业秘密解决方法,您可能需要几天时间才能找到答案。了解 10,000 种解决方法是对 Access 进行编程。这对初学者来说足够警告吗?

于 2009-11-11T06:57:40.813 回答
7

(SELECT ID FROM t2) 的子查询不能工作,除非 t2 中只有一条记录。您希望使用哪个 ID?

报告的错误消息通常发生在您有联接并且不包括更新回数据绑定表单中的表所需的所有主键时(例如,您的原始 DISTINCT 会破坏有关键的信息,所以如果它被绑定到表格,表格将无法保存回来)。

您在那里使用 DISTINCT 的事实会让我怀疑子查询在您更复杂的示例中返回的行不止一行。这可能是分配子查询结果最常见的问题:约束 where 子句。

我在分配子查询时看到的另一个问题是内部查询的语法是否不正确。至少对于 SQL 2000 和 2005 后端,查询处理器在这种情况下会静默失败并返回 NULL。(据我所知,这是一个错误:我看不出为什么在子查询中会默默地允许在顶层返回错误的东西......但它确实存在。)

编辑:为了确保 Paul 和我都不会发疯,我创建了以下表格:

t1 | ID, FK, Data
t2 | ID2, Data2

除了 ID 和 ID2 上的主键外,我没有设置任何约束。所有字段都是文本,这与我通常用于 ID 的不同,但应该是无关紧要的。

t1:

ID  FK  Data
Key1        Data1
Key2        Data2
Key3        Data3

t2:

ID2 Data2
Key1    DataA
Key2    DataB
Key3    DataC

表单查询:

UPDATE t1 SET t1.FK = (select ID2 from t2 where t2.ID2 = t1.ID);

失败了,保罗得到了同样的信息。

select *, (select ID2 from t2 where t2.ID2 = t1.ID) as foreign from t1, 

按预期工作,所以我们知道子查询语法不是罪魁祸首。

UPDATE t1 SET t1.FK = 'Key1'

也可以按预期工作,因此我们没有损坏或不可更新的目的地。

注意:如果我将数据库后端从本机更改为 SQL 2005,则更新有效!谷歌搜索了一下,我发现 Access MVPs 建议 DLOOKUP 替换子查询:

http://www.eggheadcafe.com/software/aspnet/31849054/update-with-subquerycomp.aspx

显然这是 Access SQL 中的一个错误,在使用 SQL Express 2000 或更高版本的后端时可以避免该错误。(“访问更新子查询”的谷歌结果支持这一理论)。

请参阅此处了解如何使用此解决方法:http ://www.techonthenet.com/access/functions/domain/dlookup.php

于 2009-02-11T15:18:34.150 回答
7

这对我有用(Access 2000)

UPDATE DISTINCTROW T1 inner join T2 on T2.f1 = T1.f1  SET f2 = f2;
于 2009-12-10T09:07:51.570 回答
6

我还没有阅读整个线程,但这是我正在使用的解决方案:

update (select * from t1 inner join t2 on t1.key = t2.key) set t1.field1 = t2.field2

这对我来说在 MS Access 中运行良好。

于 2009-11-04T00:04:16.400 回答
1

我的解决方案是以这种方式更改我的 sql。

  update (select o.pricein, g.pricein from operations o left join goods g on g.id = o.goodid where o.opertype = 4 and o.acct = 1) 
  set o.pricein = g.pricein
于 2010-03-04T10:14:08.253 回答
1

我在使用 Access 2010 时遇到了同样的错误(“操作必须使用可更新查询”),并且我正在使用内部连接执行简单的更新查询。我所做的只是向我要加入的表添加一个主键(当然,在我正在更新的表上已经有一个主键)并且一切正常。

于 2014-06-25T13:55:12.150 回答
0

对于这个: UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1)

UPDATE t1 INNER JOIN t2 ON t1.f1 = t2.f1 SET t1.f2 = [t2].[f2];
于 2009-02-11T22:20:13.883 回答
0

the solution to that is to give the permissions to the folder that contains the acces database that is inside the disk c

于 2021-12-11T16:45:21.427 回答