2011-03-14 135 views
6

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

如果行存在...

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

如果它不存在...

INSERT INTO Table1 VALUES (...) 

这能在一个查询做了什么?

(的ON DUPLICATE KEY UPDATE method,在MySQL的工作似乎并不在这里工作。)

+2

简单的答案是 不可以。不过,您可以使用VBA做这样的事情写的一个程序。 – shahkalpesh 2011-03-14 11:22:55

+0

[合并声明] [1]呢? [1]:http://technet.microsoft.com/en-us/library/bb510625.aspx – mcha 2011-03-14 12:30:01

+0

@mcha:MERGE是否可以与Access一起工作? – 2011-03-14 12:57:34

回答

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

您也可以反转订单并首先插入新行,然后更新所有行,如果这些行更适合您的数据。

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

-1

这并不直接适用于访问[编辑:大卫-W-芬顿声称,这是不可能的访问],但出于完整性(万一有人读,这是有意超越访问的东西):

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

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

它不能在Access中完成。 -1发布对于特定问题无用的答案。 – 2011-05-28 22:30:58

+0

我并没有提出这个问题的明确解决方案,只是可能值得研究的问题。 – 2011-06-02 08:20:26

+1

“这不直接适用于访问”关于访问的问题应该是你的暗示,你会得到downvoted。 – 2013-09-06 10:25:22

相关问题