2011-03-14 2 views
6

MS Access 2000 용 SQL 쿼리를 작성하여 행이 있으면 업데이트되고 그렇지 않은 경우 삽입됩니다. SQL 액세스 쿼리 - 행이있을 경우 업데이트,없는 경우 삽입

행이 존재하는 경우

은 ...

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

존재하지 않는 경우 ...

INSERT INTO Table1 VALUES (...) 

이는 하나 개의 쿼리에서 수행 할 수 있습니까?

(MySQL의에서 작동하는 ON DUPLICATE KEY UPDATE method는. 여기에 작동하지 않는 것)

+2

간단한 대답은 그러나 제 , 당신이 그런 일을 할 VBA를 사용하여 프로 시저를 작성 할 수 있습니다. – shahkalpesh

+0

[Merge Statement] [1]은 어떻게됩니까? [1] : http://technet.microsoft.com/en-us/library/bb510625.aspx – mcha

+0

@mcha : 'MERGE'가 Access에서 작동합니까? –

답변

7

단 한 쿼리하지만 당신은 여러 행에 대한 두 개의 질의를 할 수있다.

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

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

:

MySQL의에서

, 동등한 이미 같은 두 개의 쿼리를 작성할 수 있습니다 :

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

또는

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

두 번째 양식을 알고 (있다 또한 순서를 반대로하고 새로운 행을 먼저 삽입 한 다음 데이터가 더 잘 맞으면 모든 행을 업데이트 할 수 있습니다.

* 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

액세스 할 수 없습니다. 특정 질문에 쓸모가없는 대답을 올리려면 -1. –

+0

나는이 질문에 대한 명확한 해결책으로 이것을 제안하지 않았으며 가능한지 여부를 조사할만한 가치가있는 것입니다. –

+1

"이것은 액세스에 직접적으로 적용되지 않습니다"라는 질문에 대한 액세스에 대해서는 downvoted 얻을 것이 암시해야합니다. –