Запрос SQL-доступа - обновить строку, если существует, вставить, если не существует - PullRequest
6 голосов
/ 14 марта 2011

Мне нужно написать запрос SQL для MS Access 2000, чтобы строка обновлялась, если она существует, но вставлялась, если ее нет.

т.е.

Если строка существует ...

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

Если его не существует ...

INSERT INTO Table1 VALUES (...) 

Можно ли это сделать одним запросом?

(ON DUPLICATE KEY UPDATE , который работает в MySQL, похоже, здесь не работает.)

Ответы [ 2 ]

7 голосов
/ 14 марта 2011

Не в одном запросе, но вы можете сделать два запроса для нескольких строк.

В 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.

0 голосов
/ 26 мая 2011

Это не относится непосредственно к Access [ПРАВИТЬ: Дэвид-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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...