2012-06-12 271 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