2012-06-12 26 views
9

Tôi biết rằng trong SQL tiêu chuẩn mà bạn có thể làm điều này:Làm thế nào tôi có thể cập nhật top 100 hàng trong DB2

update top (100) table1 set field1 = 1 

(tham khảo: how can I Update top 100 records in sql server)

Nhưng điều này không được phép trong DB2. Bất cứ ai có thể tư vấn cho tôi về cách thực hiện cùng một kết quả trong DB2? Cảm ơn!

+1

'TOP x' không nằm trong tiêu chuẩn SQL, nó là một phần mở rộng độc đáo để MS SQL Server (và có lẽ Sybase). ['FETCH FIRST x ROWS'] (http://en.wikipedia.org/wiki/Select_ (SQL) #FETCH_FIRST_clause) đã được giới thiệu trong SQL: 2008 – bhamby

Trả lời

16

Đây là dooable, mặc dù bạn có thể không có được kết quả bạn mong đợi ...

Thứ nhất, luôn nhớ rằng SQL là vốn có thứ tự. Điều này có nghĩa là có không có điều nào như vậy làm hàng 'trên cùng', trừ khi bạn xác định rõ ràng ý của mình. Nếu không, kết quả của bạn là 'ngẫu nhiên' (sắp xếp).

bận tâm, đây là dooable, giả sử bạn có một số loại khóa duy nhất trên bàn:

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

Tại sao làm bạn chỉ muốn cập nhật 100 dòng tại một thời điểm? Bạn đang thực sự cố giải quyết vấn đề gì?

+1

Thật không may là không có số nhận dạng duy nhất trên các hàng, điều này làm tăng thêm niềm vui , nhưng tôi đã tìm thấy một giải pháp tương tự dựa trên ví dụ bạn đã cung cấp, vì vậy cảm ơn bạn. 100 không phải là một giới hạn cứng, mà là một cách để giữ lấy toàn bộ bảng nếu có hàng chục ngàn bản ghi. Về cơ bản, tôi có một quá trình được lên lịch trên một máy chủ JEE chạy trên một số trường hợp kiểm tra các bản ghi trong bảng này, lấy chúng 100 tại một thời điểm và xử lý chúng vào một vị trí khác. Tôi muốn đánh dấu 100 đầu tiên với một ID lô, chọn chúng, lặp lại và xử lý, sau đó xóa theo lô ID –

+1

Tôi thấy rằng nó có thể được thực hiện một chút ít chi tiết: 'UPDATE (SELECT table1Key FROM table1 WHERE field1 <> 1 ĐƠN ĐẶT HÀNG by field1 FETCH ĐẦU TIÊN 100 ROWS ONLY) SET field1 = 1' –

2

Bạn có thể sử dụng số RRN (nếu bạn chỉ quan tâm đến việc giới hạn số lượng bản cập nhật) không?

ví dụ:

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

Không phải cho một quá trình như thế này. RRN() là không sao cho một tập tin không bay hơi, nhưng tập tin này có hàng chèn và xóa. Theo mặc định, các bảng SQL sẽ có REUSEDLT (* YES), vì vậy các hàng có thể được chèn vào trong các khe của các hàng đã xóa trước đó. Nó sẽ quá dễ dàng để cập nhật các hàng sai với một số lô, hoặc có thể tệ hơn xóa một hàng đã được chèn tại RRN() = 1. – user2338816

Các vấn đề liên quan