2012-06-12 29 views
9

Ich weiß, dass Sie in Standard-SQL kann dies tun:Wie kann ich Top-100-Zeilen in DB2 aktualisieren

update top (100) table1 set field1 = 1 

(Referenz: how can I Update top 100 records in sql server)

Aber dies ist nicht in DB2 erlaubt. Kann mir jemand sagen, wie man dasselbe Ergebnis in DB2 erreichen kann? Vielen Dank!

+1

'TOP x' ist nicht in dem SQL-Standard, es ist eine Erweiterung einzigartig für MS SQL Server (und wahrscheinlich Sybase). [FETCH FIRST x ROWS] (http://en.wikipedia.org/wiki/Select_ (SQL) #FETCH_FIRST_clause) wurde in SQL eingeführt: 2008 – bhamby

Antwort

16

Dies ist dooable, obwohl Sie nicht die Ergebnisse, die Sie erwarten bekommen kann ...

Zuerst immer daran erinnern, dass SQL UNORDERED von Natur aus ist. Dies bedeutet, dass es keine solche Sache als die "obersten" Zeilen gibt, es sei denn, Sie definieren explizit, was Sie meinen. Ansonsten sind Ihre Ergebnisse "zufällig" (sortof). Unabhängig

, diese ist dooable, vorausgesetzt, Sie irgendeine Art von eindeutigen Schlüssel auf dem Tisch haben:

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

Warum tun Sie nur 100 Zeilen zu einer Zeit, aktualisieren? Was für ein Problem versuchen Sie wirklich zu lösen?

+1

Leider gibt es keinen eindeutigen Bezeichner in den Zeilen, was den Spaß erhöht , aber ich habe eine ähnliche Lösung gefunden, basierend auf dem von Ihnen bereitgestellten Beispiel, also vielen Dank. 100 ist keine harte Grenze, sondern eine Möglichkeit, die gesamte Tabelle nicht zu erfassen, wenn es Zehntausende von Datensätzen gibt. Im Wesentlichen habe ich einen geplanten Prozess auf einem JEE-Server, der über mehrere Instanzen hinweg ausgeführt wird, der nach Datensätzen in dieser Tabelle sucht, sie jeweils zu 100 Punkten ergreift und sie an einem anderen Ort verarbeitet. Ich möchte die ersten 100 mit einer Batch-ID markieren, sie auswählen, durchlaufen und verarbeiten, dann nach Batch-ID löschen –

+1

Ich fand, dass es ein wenig weniger ausführlich gemacht werden kann: 'UPDATE (SELECT table1Key FROM tabelle1 WHERE field1 <> 1 ORDER BY field1 FETCH ERSTER 100 ROWS ONLY) SET field1 = 1' –

2

Können Sie die RRN (wenn Sie nur mit der Begrenzung der Anzahl der Updates betroffen sind) verwenden?

zum Beispiel:

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

Nicht für einen Prozess wie diesen. RRN() ist in Ordnung für eine nichtflüchtige Datei, aber in diese Datei werden Zeilen eingefügt und gelöscht. Standardmäßig haben SQL-Tabellen REUSEDLT (* YES), sodass Zeilen in die Slots der zuvor gelöschten Zeilen eingefügt werden können. Es wäre zu einfach, die falschen Zeilen mit einer Chargennummer zu aktualisieren oder eine Zeile, die bei RRN() = 1 eingefügt wurde, zu löschen. – user2338816

Verwandte Themen