如果我的第一个表如果我有一个像“J1 / 2”这样的字段,它会在适当的字段中查找与J1和J2不同的表中的记录的ID。
这一切都很好。
现在我想更新原始表,所以我不必再使用这个字符串操作进行查找,但是我更新查询的尝试以“操作必须使用可更新查询”结尾
有任何想法吗?
我的SELECT语句:
SELECT DISTINCT t1.DD,t1.TN,t1.DD & " J" & MID(t1.TN,2,1) AS CalculatedStart,4,1) AS CalculatedEnd,t2.ID FROM t1 INNER JOIN t2 ON (t1.DD & " J" & MID(t1.TN,1)=t2.StartLink) AND (t1.DD & " J" & MID(t1.TN,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.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结果的可能性)
解决方法
正在报告的错误消息通常发生在连接时,并不包括以数据绑定形式更新回表格所需的所有主键(例如,您的原始DISTINCT会销毁有关键的信息,因此如果已绑定到表单,表单将无法保存)。
在这里使用DISTINCT的事实会使我怀疑子查询在更复杂的示例中返回多行。这可能是分配一个子查询结果的最常见的问题:under-constraining the where子句。
分配子查询的另一个问题是如果内部查询的语法不正确。至少在sql 2000和2005后端,查询处理器将会默认地失败,并在这种情况下返回NULL。 (这是,据我所知,一个错误:我没有理由为什么会在顶级返回错误的东西将被默认允许在子查询中…但是它是。)
编辑:
为了确保保罗或我不会疯狂,我创建了以下表格:
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,则更新将起作用!有点google搜索,我发现Access MVP建议DLOOKUP替换一个子查询:
http://www.eggheadcafe.com/software/aspnet/31849054/update-with-subquerycomp.aspx
显然这是Access sql中的一个错误,它是在使用sql Express 2000或更高版本的后端时避免的。 (“access update subquery”的google结果支持这个理论)。
请参阅此处了解如何使用此解决方法:http://www.techonthenet.com/access/functions/domain/dlookup.php