【问题标题】:SQL access query- Update row if exists, insert if does notSQL访问查询 - 如果存在则更新行,如果不存在则插入
【发布时间】:2011-07-14 22:04:21
【问题描述】:

我需要为 MS Access 2000 编写一个 SQL 查询,这样如果行存在则更新,如果不存在则插入。

如果行存在...

UPDATE Table1 SET (...) WHERE Column1='SomeValue' 

如果它不存在...

INSERT INTO Table1 VALUES (...) 

这可以在一个查询中完成吗?

(在 MySQL 中工作的 ON DUPLICATE KEY UPDATE method 似乎在这里不起作用。)

【问题讨论】:

  • 简单的答案是否定的。但是,您可以使用 VBA 编写一个程序来做这样的事情。
  • [合并声明][1]怎么样? [1]:technet.microsoft.com/en-us/library/bb510625.aspx
  • @mcha:MERGE 可以与 Access 一起使用吗?
  • 引用的 Technet 文章是针对 T-SQL 的,因此请猜测它是否适用于 Access。

标签: sql ms-access


【解决方案1】:

不是一次查询,但您可以对多行​​执行两次查询。

在 MySQL 中,等价于(如您所知:)

INSERT INTO Table1 (...)
    VALUES(...)
ON DUPLICATE KEY 
    UPDATE column=column+1
;

INSERT INTO Table1 (...)
    ( SELECT ...
        FROM ...
    )
ON DUPLICATE KEY 
    UPDATE column=column+1
;

第二种形式可以写成两个查询:

UPDATE Table1 
    SET (...) 
    WHERE Column1 = 'SomeValue'
;

INSERT INTO Table1 (...)
    ( SELECT ...
        FROM ...
        WHERE 'SomeValue' NOT IN ( SELECT Column1
                                       FROM Table1 )
    )
;

您也可以颠倒顺序并首先插入新行,然后如果更适合您的数据,则更新所有行。

*请注意,INNOT IN 子查询可能会转换为等效的 JOINLEFT JOIN with check for NOT NULL 形式。

【讨论】:

    【解决方案2】:

    这并不直接适用于 Access [编辑:David-W-Fenton 断言这在 access 中是不可能的],但为了完整性(以防阅读本文的人对其他内容感兴趣访问):

    我在 Microsoft SQL Server 中取得了成功,使用的方法应该更有效,因为它只需要进行一次索引检查,而不是两次。这是我当前项目的一个示例:

    UPDATE ActivityRelationships
    SET [Count] = ([Count] + 1)
    WHERE ActivityBeforeId=@activityBeforeId AND ActivityAfterId=@activityAfterId
    IF @@ROWCOUNT=0
        INSERT INTO ActivityRelationships ([ActivityBeforeId], [ActivityAfterId], [Count])
        VALUES (@activityBeforeId, @activityAfterId, 1)
    

    【讨论】:

    • 无法在 Access 中完成。 -1 用于发布对特定问题无用的答案。
    • 我并没有提出这个问题的明确解决方案,只是可能值得研究一下是否可行。
    • “这并不直接适用于 Access”关于访问权限的问题应该是你的暗示,你会被否决。
    猜你喜欢
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2011-03-08
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多