2010-06-08 3 views
3

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

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

+0

ли вы имеете в виду «вставить значение, если оно не существует или обновление, если оно есть»? Или вы хотите обновить существующие записи? Если так, @icktoofay имеет ответ. – jcolebrand

+0

если нет значения, тогда нам нужно вставить его, если он есть .. затем обновите его. –

+2

~ Что такое платформа SQL? T-SQL (Microsoft), MySQL, Oracle, NoSQL и т. Д. – jcolebrand

ответ

4

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

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's MERGE statement

+0

Довольно прохладно. Благодарю. Просто ради знания, есть ли что-то подобное на других платформах SQL? @sameera упомянул 'ON DUPLICATE KEY UPDATE', который также довольно прохладный. В частности, что-нибудь для sqlite? –

+0

@Cyborgo - Да. SQL Server 2008 поддерживает почти такой же синтаксис MERGE. – Thomas

+0

@Cyborgo - AFAIK, SQLIte не поддерживает MERGE. – Thomas

0

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

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

... где ? является заполнителем.

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

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

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

1

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

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

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

+0

эй. Я не мог написать комментарий правильно, поэтому я написал это как ответ.не могли бы вы заглянуть в него и сообщить мне, возможно ли это или нет. Благодарю. –

0

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

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

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

+0

Я думаю, нам также нужно знать его платформу ... Я добавлю еще один комментарий по вопросу – jcolebrand

+0

Да, и я не уверен, что если «ON EXISTING UPDATE» является расширением поставщика или нет , –

Смежные вопросы