我需要为MS Access 2000编写SQL查询,以便在存在时更新行,但如果不存在则插入。
即
如果存在行...
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
如果它不存在......
INSERT INTO Table1 VALUES (...)
这可以在一个查询中完成吗?
(在MySQL中工作的ON DUPLICATE KEY UPDATE method似乎不起作用。)
答案 0 :(得分:7)
不在一个查询中,但您可以对多行执行两次查询。
在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 )
)
;
您也可以撤消订单并首先插入新行,然后更新所有行,以便更好地符合您的数据。
*请注意,IN
和NOT IN
子查询可能会转换为等效的JOIN
和LEFT JOIN with check for NOT NULL
表单。
答案 1 :(得分:-1)
这不直接适用于Access [编辑:David-W-Fenton断言这在访问中无法实现] ,但为了完整性(如果有人读到此内容对某些内容感兴趣访问):
我在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)