2012-06-12 25 views
9

So che in SQL standard si può fare questo:Come posso aggiornare prime 100 righe in DB2

update top (100) table1 set field1 = 1 

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

Ma questo non è consentito in DB2. Qualcuno può consigliarmi su come ottenere lo stesso risultato in DB2? Grazie!

+1

'x' TOP non è nello standard SQL, è un'estensione unica per MS SQL Server (e probabilmente Sybase). ['FETCH FIRST x ROWS'] (http://en.wikipedia.org/wiki/Select_ (SQL) #FETCH_FIRST_clause) è stato introdotto in SQL: 2008 – bhamby

risposta

16

Questo è dooable, anche se non si può ottenere i risultati che ci si aspetta ...

First, sempre ricordare che SQL è intrinsecamente UNORDERED. Ciò significa che non c'è nessuna di queste cose come le righe 'in alto', a meno che non si definisca esplicitamente cosa intendi. Altrimenti, i risultati sono "casuali" (sortof).

Indipendentemente da ciò, questo è dooable, presumendo di avere una sorta di chiave univoca sul tavolo:

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

Perché vuoi aggiornare solo 100 righe alla volta? Che tipo di problema stai davvero cercando di risolvere?

+1

Sfortunatamente non esiste un identificativo univoco sulle righe, il che aggiunge divertimento , ma ho trovato una soluzione simile basata sull'esempio che hai fornito, quindi grazie. 100 non è un limite difficile, ma piuttosto un modo per evitare di afferrare l'intera tabella se ci sono decine di migliaia di record. Essenzialmente, ho un processo pianificato su un server JEE che viene eseguito su un numero di istanze che controlla i record in questa tabella, li afferra 100 alla volta e li elabora in un'altra posizione. Voglio contrassegnare i primi 100 con un ID batch, selezionarli, eseguire il loop e processare, quindi eliminare per ID batch –

+1

Ho scoperto che può essere eseguito un po 'meno in modo verboso: 'UPDATE (SELECT table1Key FROM table1 WHERE field1 <> 1 ORDER BY field1 SOLO FETCH FIRST 100 ROWS) SET field1 = 1' –

2

È possibile utilizzare lo RRN (se si è limitati a limitare il numero di aggiornamenti)?

ad esempio:

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

Non per un processo come questo. RRN() va bene per un file non volatile, ma questo file sta avendo file inserite ed eliminate. Per impostazione predefinita, le tabelle SQL avranno REUSEDLT (* YES), quindi le righe possono essere inserite negli slot delle righe precedentemente eliminate. Sarebbe troppo facile aggiornare le righe sbagliate con un numero di lotto, o forse peggio eliminare una riga che è stata inserita in RRN() = 1. – user2338816

Problemi correlati