SQL更新帮助

SQL更新帮助,sql,ruby-on-rails,oracle,Sql,Ruby On Rails,Oracle,我有一个非常简单的问题,是否可以只使用一个update语句用新值更新表 比如说,我有一张表格,上面有作者、标题、日期、受欢迎程度。现在我得到了一些新的数据,这些数据有作者姓名、标题和新的流行程度。现在如何在一条语句中更新表。请注意,作者和标题不是唯一的。如果我正确理解您的意思,类似的内容应该可以: update books set popularity=? where author=? and title=? …其中,?是占位符 编辑:根据您的评论,如果它不存在,您希望创建它,如果它存在,则更

我有一个非常简单的问题,是否可以只使用一个update语句用新值更新表


比如说,我有一张表格,上面有作者、标题、日期、受欢迎程度。现在我得到了一些新的数据,这些数据有作者姓名、标题和新的流行程度。现在如何在一条语句中更新表。请注意,作者和标题不是唯一的。

如果我正确理解您的意思,类似的内容应该可以:

update books set popularity=? where author=? and title=?
…其中,
是占位符

编辑:根据您的评论,如果它不存在,您希望创建它,如果它存在,则更新它。我认为你一句话也做不到,但我可能错了。在两条语句中,您可以使用该语句检查它是否已经存在:

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

如果存在,则输出1;如果不存在,则输出0。从那里你可以选择是插入还是更新。

因为我发表了评论,所以我也会发布答案@icktoofay发布了一个解决方案,但使用我们可以得出结论,它实际上会导致表扫描,因此请尝试Jeremiah Clark的解决方案:

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

请注意,这将首先尝试更新,如果成功,
@@ROWCOUNT
将为1或更多,但我假设您将使用T-SQL(Microsoft的SQL语言)。我不知道任何其他平台都支持
@@ROWCOUNT

我在SQL Anywhere中使用过它(但不确定您使用的是什么DBMS)


因此,如果记录存在,它只需更新它。否则,请创建一个新记录。

您可以使用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);

在mySQL中,您有一个名为“ON DUPLICATE KEY UPDATE”的命令,我在oracle中找到了相同的命令(称为Merge)

看看这篇文章

干杯,
sameera

您的意思是“如果不存在则插入值,如果存在则更新”?还是只想更新现有记录?如果是这样,@icktoofay有答案。如果没有值。。然后我们需要插入它,如果它在那里。。然后更新它。~什么SQL平台?T-SQL(微软的)、MySQL、Oracle、NoSQL等等……是的。。对不起,我错过了细节。我正在使用Rails和Oracle数据库..我想我们也需要了解他的平台。。。我会在这个问题上再加上一条评论是的,我不确定“现有更新”是否是供应商的扩展。我不能正确地写评论,所以我写了它作为回答。。请你调查一下,告诉我是否可能。谢谢,很酷。谢谢只是为了知道,在其他SQL平台中是否有类似的东西@sameera在重复密钥更新中提到了
,这也有点酷。特别是sqlite有什么吗?@Cyborgo-有。SQL Server 2008支持几乎相同的合并语法。@Cyborgo-AFAIK,SQLIte不支持合并。~我正要问同样的问题,谢谢您提供有关SQL Server 2k8合并的信息。我包里有新工具!
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);