2012-06-12 232 views
9

更新前100行我知道,在标准的SQL,你可以这样做:我怎样才能在DB2

update top (100) table1 set field1 = 1 

(参考:how can I Update top 100 records in sql server

但这不是在DB2不允许的。任何人都可以告诉我如何在DB2中完成相同的结果?谢谢!

+1

'TOP x'不在SQL标准,这是唯一的MS SQL服务器(可能的Sybase)的延伸。 SQL中引入了['FETCH FIRST x ROWS'](http://en.wikipedia.org/wiki/Select_(SQL)#FETCH_FIRST_clause):2008 – bhamby

回答

16

这是dooable,虽然你可能不会得到你所期望的结果...

首先,永远记住这 SQL本身就是无序。这意味着有没有这样的东西作为'顶部'行,除非你明确地定义你的意思。否则,你的结果是'随机'(排序)。

无论如何,这是 dooable,假设你有某种桌子上唯一键的:

UPDATE table1 SET field1 = 1 
WHERE table1Key IN (SELECT table1Key 
        FROM table1 
        WHERE field1 <> 1 
        ORDER BY field1 
        FETCH FIRST 100 ROWS ONLY) 

为什么你只需要在一个时间更新100行?你真的想要解决什么样的问题?

+1

不幸的是,行上没有唯一标识符,这增加了有趣的,但我发现基于您提供的示例的类似解决方案,所以谢谢。 100不是一个硬性的限制,而是一种避免抓取整个表的方法,如果有成千上万的记录。实际上,我在JEE服务器上安排了一个计划进程,该进程跨多个检查此表中的记录的实例运行,并一次捕获100个实例并将它们处理到另一个位置。我想用批次ID标记第一个100,选择它们,循环并处理,然后按批次ID删除 –

+1

我发现它可以做得稍微少一点:'UPDATE(SELECT table1Key FROM table1 WHERE field1 <> 1 ORDER BY field1 FETCH FIRST 100 ROWS ONLY)SET field1 = 1' –

2

您可以使用RRN(如果您只关心限制更新次数)?

例如:

update mytable a set a.field = 'foo' where RRN(a) < 200 
+0

不适合这样的过程。对于非易失性文件,RRN()可以,但是该文件插入并删除了行。默认情况下,SQL表将具有REUSEDLT(* YES),因此可以将行插入先前删除的行的插槽中。使用批号更新错误行太容易了,或者可能更糟糕的是删除在RRN()= 1处插入的行。 – user2338816