如何更新DB2表中的前n条记录

cpjpxq1n  于 2023-06-05  发布在  DB2
关注(0)|答案(3)|浏览(270)

我在尝试更新db2表的前100条记录时遇到了困难。我在Squirrel 3.5.0中运行查询
如果我这样做:

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中建议的方法
你能帮帮我吗?
谢谢

7fhtutme

7fhtutme1#

当你像这样更改更新时会发生什么。

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列改为identityAuto generated

wvmv3b1j

wvmv3b1j2#

就我所知,您的更新查询是有效的(您没有说明您使用的是哪个版本的db2,所以我假设是LUW 9.7或更高版本)。可能是squirrel向查询添加了一些东西,尝试取消选中限制squirrel接收行数的复选框。
如果你有唯一标识一行的东西(我假设这里是cust_id),你可以使用merge语句:

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;
yvgpqqbh

yvgpqqbh3#

如果表没有id,可以使用相对记录号。

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

相关问题