2011-03-14 132 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

相關問題