1

我正在编写一个 VB 应用程序,它正在清理 DB2 数据库中的一些数据。在几个表中,我想更新整个列。例如帐号列。我将所有帐号更改为从 1 开始,并随着列表的下降而递增。我希望能够同时返回旧帐号和新帐号,这样我就可以生成某种我可以参考的报告,这样我就不会丢失原始值。我这样更新列:

DECLARE @accntnum INT 
SET @accntnum = 0 
UPDATE accounts
SET @accntnum = accntnum = @accntnum + 1
GO 

有没有办法让我在一张表中同时返回原始的 accntnum 和新的 accntnum ?

4

3 回答 3

3

DB2 有一个非常棒的特性,您可以在其中从“数据更改语句”中选择数据。这在 DB2 for Linux/Unix/Windows 上进行了测试,但我认为它至少也应该在DB2 for z/OS上工作。

对于您的编号,您也可以考虑创建一个序列。那么您的更新将类似于:

 CREATE SEQUENCE acct_seq
     START WITH 1
     INCREMENT BY 1
     NO MAXVALUE
     NO CYCLE
     CACHE 24
;

SELECT accntnum  AS new_acct, old_acct
FROM FINAL TABLE (
    UPDATE accounts INCLUDE(old_acct INT)
    SET accntnum = NEXT VALUE FOR acct_seq, old_acct = accntnum
)
ORDER BY old_acct;

INCLUDE部分在结果表中创建一个新列,指定名称和数据类型,然后您可以像设置任何其他字段一样在更新语句中设置值。

于 2013-08-15T22:18:36.220 回答
1

一种可能的解决方案是添加一个附加列(我们称之为它oldaccntnum)并在您进行更新时为该列分配旧值。然后在不再需要时将其丢弃。

于 2013-08-15T18:20:43.060 回答
0

这是我要做的:

-- create a new table to track the changes.
    - with columns identifying a unique key, old-vale, new-value, timestamp

-- create a trigger on the accounts table 
   to write the old and new values to the new table.

但是,不知道所有条件,可能不值得麻烦。

于 2013-08-15T18:24:27.497 回答