Справка по обновлению SQL - PullRequest
3 голосов
/ 09 июня 2010

У меня очень простой вопрос, можно ли обновить таблицу новыми значениями, используя всего один оператор обновления.

Скажем, например, у меня есть таблица с автором, названием, датой, популярностью. Теперь я получил новые данные, которые имеют имя автора, название, соответствующее новой популярности. Как мне обновить таблицу сейчас одним оператором. Обратите внимание, что автор и название не являются уникальными.

Ответы [ 5 ]

4 голосов
/ 09 июня 2010

Вы можете сделать это одним оператором, используя оператор Oracle MERGE:

MERGE DestinationTable target
USING   (
        Select 'Briggs' Author, 'My Next Master' Title, 6 Popularity
        Union All Select 'Millis', 'Man up, Nut head', 3
        ) Z
        ON Z.Author = target.Author
            And Z.Title = target.Title
WHEN MATCHED THEN
    UPDATE SET target.Popularity = Z.Popularity
WHEN NOT MATCHED THEN
    Insert(Author, Title, Popularity) Values(Z.Author, Z.Title, Z.Popularity);

Оператор Oracle MERGE

1 голос
/ 09 июня 2010

Поскольку я разместил комментарий, я также опубликую ответ. @icktoofay опубликовал одно решение, но, используя эту ссылку , мы можем проследить, что оно на самом деле вызовет сканирование таблицы, поэтому вместо этого попробуйте решение Джереми Кларка:

UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)

Обратите внимание, что сначала выполняется попытка обновления, и в случае успеха @@ROWCOUNT будет равно 1 или более, но я предполагаю, что вы будете использовать T-SQL (язык SQL Microsoft). Я не знаю, что @@ROWCOUNT поддерживается любыми другими платформами.

0 голосов
/ 09 июня 2010

В mySQL у вас есть команда, которая называется «ON DUPLICATE KEY UPDATE», и я нашел то же самое для oracle (его называют Merge)

, посмотрите эту статью

http://blog.mclaughlinsoftware.com/2009/05/25/mysql-merge-gone-awry/

ура, Самера

0 голосов
/ 09 июня 2010

Я использовал это в SQL Anywhere (хотя не уверен, какую СУБД вы используете)

INSERT INTO "books" ("title", "author", "popularity") ON EXISTING UPDATE VALUES(?,?,?);

Так что, если запись существует, она просто обновляет ее. В противном случае создайте новую запись.

0 голосов
/ 09 июня 2010

Если я правильно вас понимаю, что-то вроде этого должно работать:

update books set popularity=? where author=? and title=?

... где ? - заполнитель.

Редактировать: Согласно вашему комментарию, вы хотите создать его, если он не существует, и обновить его, если он существует.Я не думаю, что вы можете сделать это с одним утверждением, но я могу ошибаться.В двух утверждениях вы можете использовать это, чтобы проверить, существует ли оно уже:

select count(*) from books where author=? and title=? limit 1

Это вывело бы 1, если оно существует, или 0, если его нет.Оттуда вы можете выбрать, вставлять или обновлять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...