2012-06-12 8 views
9

wiem, że w standardzie SQL można to zrobić:Jak mogę zaktualizować top 100 wierszy w DB2

update top (100) table1 set field1 = 1 

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

Ale to nie jest dozwolone w DB2. Czy ktoś może mi doradzić, jak osiągnąć ten sam wynik w DB2? Dzięki!

+1

'TOP x' nie jest w standardzie SQL, to przedłużenie unikalna dla MS SQL Server (i prawdopodobnie Sybase). ['FETCH FIRST x ROWS'] (http://en.wikipedia.org/wiki/Select_ (SQL) #FETCH_FIRST_clause) został wprowadzony w SQL: 2008 – bhamby

Odpowiedz

16

To dooable, choć może nie uzyskać oczekiwane rezultaty ...

pierwsze, zawsze pamiętać że SQL jest z natury nieuporządkowane. Oznacza to, że nie ma czegoś takiego, jak jako "górny" wiersz, chyba że wyraźnie zdefiniujesz, co masz na myśli. W przeciwnym razie twoje wyniki są "losowe" (sortof).

Niezależnie od tego, jest dooable, zakładając masz jakiegoś unikalnego klucza na stole:

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

Dlaczego ty tylko chcesz zaktualizować 100 wierszy naraz? Jaki problem próbujesz rozwiązać?

+1

Niestety nie ma unikalnego identyfikatora w wierszach, co zwiększa przyjemność , ale znalazłem podobne rozwiązanie na podstawie podanego przykładu, więc dziękuję. 100 nie jest twardym limitem, ale raczej sposobem na uchwycenie całego stołu, jeśli istnieją dziesiątki tysięcy rekordów. Zasadniczo mam zaplanowany proces na serwerze JEE, który działa w wielu instancjach, które sprawdzają rekordy w tej tabeli, pobierają je po 100 jednocześnie i przetwarzają je w inne miejsce. Chcę zaznaczyć pierwsze 100 z identyfikatorem partii, wybrać je, przepętlić i przetworzyć, a następnie usunąć wsadowo ID –

+1

Zauważyłem, że można to zrobić nieco mniej gadatliwie: 'UPDATE (WYBIERZ table1Key z table1 WHERE field1 <> 1 ORDER BY field1 TYLKO ZA PIERWSZE 100 WIERSZY) SET field1 = 1'' –

2

Czy możesz użyć RRN (jeśli chcesz ograniczyć liczbę aktualizacji)?

na przykład:

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

Nie dla takiego procesu. Funkcja RRN() jest w porządku dla nieulotnego pliku, ale ten plik zawiera wiersze wstawione i usunięte. Domyślnie tabele SQL mają REUSEDLT (* YES), więc wiersze mogą być wstawiane do wcześniej usuniętych wierszy. Byłoby zbyt łatwo zaktualizować nieprawidłowe wiersze numerem partii, lub może gorzej usunąć wiersz wstawiony przy RRN() = 1. – user2338816