2010-06-08 52 views
3

我有一個非常簡單的問題,是否可以使用一個更新語句更新具有新值的表。SQL更新幫助

說例如我有一個作者,標題,日期,流行度表。現在我得到了一些具有作者姓名的新數據,標題對應着新的人氣。我如何在一個聲明中更新表格。請注意作者和標題不是唯一的。

+0

你的意思是「插入值,如果它不存在或更新,如果它的存在」?或者你只想更新現有記錄?如果是這樣,@icktoofay有答案。 – jcolebrand 2010-06-08 22:56:49

+0

如果沒有值,那麼我們需要插入它,如果它存在..然後更新它。 – 2010-06-08 22:59:34

+2

〜什麼SQL平臺? T-SQL(微軟),MySQL,甲骨文,NoSQL等... – jcolebrand 2010-06-08 23:10:08

回答

4

您可以使用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's MERGE statement

+0

很酷。謝謝。只是爲了知道,其他SQL平臺中是否有類似的東西? @sameera提到'在重複密鑰更新'這也是一個很酷。特別是有什麼用於sqlite? – 2010-06-09 04:31:29

+0

@Cyborgo - 是的。 SQL Server 2008支持幾乎相同的MERGE語法。 – Thomas 2010-06-09 04:34:58

+0

@Cyborgo - AFAIK,SQLIte不支持MERGE。 – Thomas 2010-06-09 04:36:55

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(Microsoft的SQL語言)。我不知道其他任何平臺都支持@@ROWCOUNT

+0

嘿。我無法正確寫出評論,所以我把它寫成了答案。你可以請看看它,讓我知道如果有可能或沒有。謝謝。 – 2010-06-09 03:43:04

0

我在SQL Anywhere中使用這個(不知道你正在使用的數據庫管理系統,雖然)

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

因此,如果記錄存在,它只是更新它。否則,創建一個新的記錄。

+0

我認爲我們也需要了解他的平臺...我會在這個問題上再添加一個評論 – jcolebrand 2010-06-08 23:09:48

+0

是的,如果'ON EXISTING UPDATE'是一個供應商擴展或者不是我的頭頂, 。 – 2010-06-08 23:11:12