SQL Update帮助

时间:2010-06-08 22:52:29

标签: sql ruby-on-rails oracle

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

比如说我有一个包含作者,标题,日期,受欢迎程度的表格。现在我得到了一些新的数据,其中有作者姓名,标题相应的新人气。如何在一个语句中更新表。请注意,作者和标题不是唯一的。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

自从我发表评论后,我也会发布一个答案。 @icktoofay发布了一个解决方案,但使用this link我们可以遵循它实际上会导致表扫描,所以请尝试Jeremiah Clark的解决方案:

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

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

答案 2 :(得分:0)

如果我理解正确,那么这样的事情应该有效:

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

...其中?是占位符。

修改:根据您的评论,您希望在不存在时创建它,如果不存在则更新它。我不认为你能用一个陈述做到这一点,但我可能错了。在两个语句中,您可以使用它来检查它是否已存在:

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

如果存在则输出1,否则输出0。从那里您可以选择是否插入或更新。

答案 3 :(得分:0)

我在SQL Anywhere中使用过它(不知道你正在使用什么DBMS)

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

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

答案 4 :(得分:0)

在mySQL中你有一个名为'ON DUPLICATE KEY UPDATE'的命令,我发现oracle(它叫做Merge)也是一样的

看一下这篇文章

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

欢呼声, sameera