2014-12-31 4 views
0

Мне нелегко пытаться обновить первые 100 записей таблицы db2. Я бегу запрос от Squirrel 3.5.0Как я могу обновить первые n записей в таблице DB2

Если я это сделать:

SELECT * 
FROM "CUSTOMERS" 
WHERE CITY = 'SAN JOSE' 
FETCH FIRST 100 ROW ONLY 

фильтрует данные надлежащим образом, но когда я делаю это:

UPDATE (SELECT * FROM "CUSTOMERS" WHERE CITY = 'SAN JOSE' FETCH FIRST 100 ROWS ONLY) 
    SET NAME = 'MARIO', LASTNAME = 'PEREZ' 

он выдает эту ошибку

Error: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=(;<IDENTIFIER> STATISTICS, DRIVER=3.53.95 
SQLState: 42601 
ErrorCode: -104 

Я следую подходу, который предлагается по этой ссылке http://db2guideonline.blogspot.com/2013/04/select-update-delete-n-number-of-rows.html

Не могли бы вы помочь мне?

Thanks

+0

Сторона примечания - таблицы в SQL представляют собой неупорядоченные множества, поэтому нет «первых 100 строк». Это было бы (если бы оно работало) обновлять первые 100 строк, которые выбирает оптимизатор (что является _probably_ строками с наименьшими первичными ключами в таблице, но это не гарантировано.). Попытка распространить это на вторую страницу результатов становится сложнее. –

ответ

1

Что происходит, когда вы меняете свое обновление следующим образом.

UPDATE CUSTOMERS 
SET NAME = 'MARIO', 
     LASTNAME = 'PEREZ' 
WHERE customer_id IN (SELECT customer_id 
         FROM CUSTOMERS 
         WHERE CITY = 'SAN JOSE' 
         FETCH FIRST 100 ROWS ONLY) 

Примечание: изменить столбец в customer_id к identity или Auto generated вашего стола

+0

... почему вы рекомендуете изменять тип столбца id? Я не могу придумать ни одной причины, чтобы оператор не работал независимо от типа столбца. –

1

Ваш запрос на обновление действует, насколько я могу сказать (вы не сказали, какая версия db2 используется так Я предполагаю LUW 9.7 и более поздние). Возможно, что белка добавляет что-то в запрос, попробуйте снять флажок, ограничивающий количество строк, которые получают белка.

В случае, если у вас есть что-то, что однозначно идентифицирует строку (я предполагаю, что cust_id здесь), вы можете использовать совмещенное заявление:

merge into CUSTOMERS x 
using ( 
    SELECT * FROM CUSTOMERS 
    WHERE CITY = 'SAN JOSE' 
    FETCH FIRST 100 ROWS ONLY 
) y 
    on x.cust_id = y.cust_id 
when matched then update    
    SET NAME = 'MARIO', LASTNAME = 'PEREZ'; 

Еще один вариант для перечисления строк в таблице, как в:

UPDATE ( 
    SELECT x.*, row_number() over() as rn 
    FROM CUSTOMERS x 
    WHERE CITY = 'SAN JOSE' 
)  
    SET NAME = 'MARIO', LASTNAME = 'PEREZ' 
where rn <= 100; 
+0

Без 'ORDER BY' конкретные строки, пронумерованные функцией окна, являются случайными, но, предположительно, это не проблема, учитывая исходный запрос, который был запущен OP ... –