我有一个非常简单的问题,是否可以使用一个更新语句更新具有新值的表。
比如说我有一个包含作者,标题,日期,受欢迎程度的表格。现在我得到了一些新的数据,其中有作者姓名,标题相应的新人气。如何在一个语句中更新表。请注意,作者和标题不是唯一的。
答案 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);
答案 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