如何在表和查询上使用SELECT进行INSERT

时间:2012-01-30 17:10:39

标签: sql ms-access

我在基于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尝试了其他几种解决方案,但没有找到解决方案。

有人知道一个聪明的解决方案吗?

5 个答案:

答案 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表示您没有创建可更新的查询时,它会将查询的“唯一记录”属性设置为“是”。