SQL access query-обновить строку, если существует, вставить, если нет

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

то есть

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

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

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

INSERT INTO Table1 VALUES (...) 

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

(на метод обновления дубликатов ключей это работает в MySQL, похоже, не работает здесь.)

2 ответов


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

в 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 "формы".


это не относится непосредственно к Access [EDIT: David-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)