【问题标题】:How to INSERT using SELECT on Table and Query如何在表和查询上使用 SELECT 插入
【发布时间】:2012-01-31 21:44:39
【问题描述】:

我在基于 JOIN 访问 UPDATE 时遇到问题。

有两条语句需要合并:

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

有人知道这方面的智能解决方案吗?

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    试试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)
    

    【讨论】:

      【解决方案2】:

      使用连接语法,而不是 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))
      

      【讨论】:

      • 奥利维尔,谢谢。这正是问题所在。 viewB 不可更新,因为它使用 DISTINCT - 但如果您查看我的代码,我不想更新 viewB 的任何内容,但我需要它来查找要更新的记录。有什么想法吗?
      • 在这种情况下,您可以使用子查询(正如 Andomar 已经提出的那样):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))。查看我的编辑。
      • 不,它不起作用:子查询工作正常,但 UPDATE 对所有记录进行操作:在我看来,上层查询和子查询连接不正确。
      • tableA和viewB的主键不同:viewB没有PK。
      • 它将更新tableA中的每条记录,这些记录在viewB中有对应的记录,tableA.f2=viewB.f2 AND tableA.f3=viewB.f3为真。
      【解决方案3】:
      UPDATE tableA
        SET a.f1 = 'x'
        from  tableA a, viewB b
        WHERE a.f2 = b.f2 AND a.f3 = b.f3
      

      【讨论】:

        【解决方案4】:

        您需要授予权限。从该文件夹或 mdb 文件中删除只读,以便它允许更新检查此链接。

        Operation must use an updateable query. (Microsoft JET Database Engine)

        ASp.net forum thread for : opreation must use an updateble query

        【讨论】:

          【解决方案5】:

          有时当 Access 说您没有创建可更新查询时,它会响应将查询的“唯一记录”属性设置为“是”。

          【讨论】:

            猜你喜欢
            • 2021-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多