我在基于JOIN访问UPDATE时遇到问题。
我需要合并2个声明:
SELECT a.f1, a.f2, a.f3
FROM tableA a, viewB b
WHERE a.f2 = b.f2 AND a.f3 = b.f3
viewB是一个查询,但工作正常
UPDATE tableA a
SET a.f1 = 'x'
也很好。
现在我尝试:
UPDATE tableA a, viewB b
SET a.f1 = 'x'
WHERE a.f2 = b.f2 AND a.f3 = b.f3
失败,Access说:
操作必须使用可更新的查询。
这是愚蠢的,因为viewB中没有触及任何字段。 我使用FROM,JOIN Subselect尝试了其他几种解决方案,但没有找到解决方案。
有人知道一个聪明的解决方案吗?
答案 0 :(得分:5)
尝试使用update .. join
语法:
update tableA a
inner join viewB b on a.f2 = b.f2 and a.f3 = b.f3
set a.f1 = 'x'
或者:
update tableA a
set a.f1 = 'x'
where exists (select * from viewB b where a.f2 = b.f2 and a.f3 = b.f3)
答案 1 :(得分:3)
使用连接语法而不是where语法来连接表:
UPDATE tableA AS a
INNER JOIN viewB AS b
ON (a.f2 = b.f2) AND (a.f3 = b.f3)
SET a.f1 = 'x';
另请注意,只有viewB
可更新时才会起作用。例如,如果viewB
具有GROUP BY或UNION,则它将不可更新。
编辑:如果viewB
不可更新,子查询而不是连接将有所帮助:
UPDATE tableA AS a
SET a.f1 = 'x'
WHERE EXISTS (SELECT *
FROM viewB AS b
WHERE (a.f2=b.f2) AND (a.f3=b.f3))
答案 2 :(得分:0)
您需要授予权限。从该文件夹或mdb文件中删除只读,以便它可以更新检查此链接。
Operation must use an updateable query. (Microsoft JET Database Engine)
ASp.net forum thread for : opreation must use an updateble query
答案 3 :(得分:0)
UPDATE tableA
SET a.f1 = 'x'
from tableA a, viewB b
WHERE a.f2 = b.f2 AND a.f3 = b.f3
答案 4 :(得分:0)
有时,当Access表示您没有创建可更新的查询时,它会将查询的“唯一记录”属性设置为“是”。