繁体   English   中英

SQL访问查询 - 如果存在则更新行,如果不存在则插入

[英]SQL access query- Update row if exists, insert if does not

我需要为MS Access 2000编写SQL查询,以便在存在时更新行,但如果不存在则插入。

如果行存在...

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

如果它不存在......

INSERT INTO Table1 VALUES (...) 

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

(在MySQL中工作的ON DUPLICATE KEY UPDATE方法似乎不适用于此。)

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

在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表单。

这不直接适用于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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM