【问题标题】:How can I update top 100 rows in DB2如何更新 DB2 中的前 100 行
【发布时间】:2012-06-14 04:27:55
【问题描述】:

我知道在标准 SQL 中你可以这样做:

update top (100) table1 set field1 = 1

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

但这在 DB2 中是不允许的。谁能告诉我如何在 DB2 中完成相同的结果?谢谢!

【问题讨论】:

  • TOP x 不在 SQL 标准中,它是 MS SQL Server(可能还有 Sybase)独有的扩展。 FETCH FIRST x ROWS 在 SQL:2008 中引入

标签: sql db2 ibm-midrange


【解决方案1】:

这是可行的,尽管您可能无法获得预期的结果...

首先,永远记住SQL本质上是UNORDERED。这意味着 没有“顶”行这样的东西,除非您明确定义您的意思。否则,您的结果是“随机的”(排序)。

无论如何,这可行的,假设您在桌子上有某种唯一键:

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

为什么您一次只想更新 100 行?你真正想解决什么样的问题?

【讨论】:

  • 不幸的是,行上没有唯一标识符,这增加了乐趣,但我根据您提供的示例找到了类似的解决方案,所以谢谢。 100 不是硬限制,而是一种在有数万条记录时避免抓取整个表的方法。本质上,我在 JEE 服务器上有一个计划进程,该进程跨多个检查该表中记录的实例运行,一次抓取 100 个并将它们处理到另一个位置。我想用批次ID标记前100个,选择它们,循环处理,然后按批次ID删除
  • 我发现它可以做得不那么冗长:UPDATE (SELECT table1Key FROM table1 WHERE field1 &lt;&gt; 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

【讨论】:

  • 不适用于这样的过程。 RRN() 对于非易失性文件是可以的,但是这个文件有插入和删除的行。默认情况下,SQL 表将具有 REUSEDLT(*YES),因此可以将行插入到先前删除的行的槽中。使用批号更新错误的行太容易了,或者更糟糕的是删除在 RRN()=1 处插入的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多