2010-06-08 53 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