0

我需要将 DB2 表中的某一行乘以 18000 次。某些列值将保持原始值,而某些列值需要增加 1。

我对 DB2 知之甚少,我只是找不到关于如何做到这一点的具体简单答案。有人可以给我一个关于如何实现这一目标的例子吗?

DB2 版本:9.7 / 操作系统:Windows 2k8

例如我有下表:

T_RES_TABLE
Col1 |Col2|Col3 |Col4|
----------------------
1    |   1|    1|   1|

我需要实现的是:

T_RES_TABLE
Col1 |Col2|Col3 |Col4|
----------------------
1    |   1|    1|   1| - original
----------------------
2    |   1|    2|   1|
----------------------
.
.
.
----------------------
18000|   1|18000|   1|

所以 Col1 和 Col3 需要增​​加,其余的必须保持原样。希望它足够清楚。

4

2 回答 2

4

您可以使用递归查询来生成新的列值:

    $ db2 "create table t_res_table (col1 int, col2 int, col3 int, col4 int)"
    DB20000I  The SQL command completed successfully.

    $ db2 "insert into t_res_table values (1,1,1,1)"
    DB20000I  The SQL command completed successfully.

    $ db2 "select * from t_res_table"

    COL1        COL2        COL3        COL4       
    ----------- ----------- ----------- -----------
                1           1           1           1

      1 record(s) selected.

    $ db2 "insert into t_res_table \
    >with t (col1, col2, col3, col4, lvl) as ( \
    >select col1, col2, col3, col4, 1  from t_res_table where col1 =1 \
    >union all \
    >select col1+1, col2, col3+1, col4, lvl+1 from t where lvl <18) \
    >select col1, col2, col3, col4 from t where col1 > 1"
    DB20000I  The SQL command completed successfully.

    $ db2 "select * from t_res_table"

    COL1        COL2        COL3        COL4       
    ----------- ----------- ----------- -----------
                1           1           1           1
                2           1           2           1
                3           1           3           1
                4           1           4           1
                5           1           5           1
                6           1           6           1
                7           1           7           1
                8           1           8           1
                9           1           9           1
               10           1          10           1
               11           1          11           1
               12           1          12           1
               13           1          13           1
               14           1          14           1
               15           1          15           1
               16           1          16           1
               17           1          17           1
               18           1          18           1

      18 record(s) selected.
于 2013-07-19T14:41:47.667 回答
2

这将完成你的工作。只需根据需要更改它,更改表名和列名并点击运行。我不知道你想要实现什么,但听起来你只需要一个表中的虚拟数据。所以,我只是为了虚拟目的而制作它。

修改它以满足您的其他要求。下面的示例包含您需要的所有内容,但您可能需要根据该示例进行修改。

DECLARE @I INT=0
SET @I=1
DECLARE @LASTF2 INT
DECLARE @LASTF4 INT

SELECT @LASTF2=ISNULL(MAX(F2),1) FROM TEST --JUST CHANGE TEST TO YOUR TABLENAME, AND     F1,F2,F3,F4 
SELECT @LASTF4=ISNULL(MAX(F4),1) FROM TEST -- AS YOUR FIELD NAMES

WHILE @I<10000
BEGIN
    INSERT INTO TEST (F1,F2,F3,F4)
    VALUES (@I,@LASTF2,@I,@LASTF4)

    SET @I=@I+1
END
GO
SELECT * FROM TEST
于 2013-07-19T14:09:42.157 回答