DB2 SQL基于其他行添加行

时间:2009-09-11 10:44:06

标签: sql db2

我有一个select语句,我想用它作为向表中添加更多行的基础。 新行将修改一些列,并且还必须更改原始行。

这是一次性发生,如果有帮助,DB可以脱机。

有什么想法吗?

谢谢, 乔

=================

说明更新

MBANK表

       |MID  |MAGN|MAAID|MTYPEOT|        MAVAILS|MUSER|MTS
OLD    |65   |   9|    3|      2|              A|NAME |20090909
NEW    |65   |  10|    0|      2|              A|NAME |20090910
CHANGE |SAME |  +1| TO 0|   SAME|New = A Old = O|SAME |TIMESTAMP

必须在选择中对大约4000条记录进行此操作。

从MDSTD.MBANK中选择*,其中MTYPEOT ='2'且MAVAILS ='A'

2 个答案:

答案 0 :(得分:4)

DrJokepu解决方案没问题,但这取决于您在问题中称为“更改”的内容是否已修复。即:你总是要为第二列改变+1吗?或者这些变化是“动态的”,你必须决定运行时哪些变化你将要应用?

在DB2和任何其他SQL中都有不同的结构(比如DB2中的insert)或者用于MS-SQL的SELECT INTO,它们允许您构造一组查询。

如果我没弄错的话,你想这样做:

  1. 将一些值插入来自select(您称之为“old”)
  2. 的表中
  3. 创建另一组记录(如“旧”记录)但修改其值。
  4. 或许你只想做第二名。

    第1号很容易,正如Dr.Jokepu已经告诉你的那样:

    INSERT INTO <table> (values) SELECT "values" FROM <anotherTable>;
    

    您可以随时在同一查询中执行的数字2,在您选择时添加更改:

    INSERT INTO MDSTD.MBANK ( MID, MAGN, MAAID, MTYPEOT, MAVAILS, MUSER, MTS)
    SELECT 
          MID 
         ,MAGN + 1
         ,0 as MAAID
         ,MTYPEOT
         ,'A' as MAVAILS
         ,MUSER
         ,GETDATE() 
    FROM mdstd.mbank 
    WHERE MTYPEOT = '2' and MAVAILS = 'A'
    

    (注意GETDATE()是一个MS-SQL函数,我现在不记得DB / 2的确切函数了。)

    在你的例子中,你提到了一个问题:

    “New = A Old = O”

    如果Old更改为“O”,那么您真的想要更改原始行吗?这个问题的答案取决于你想要完成的确切任务,对我来说仍然不清楚。

    如果要复制行并更改“副本”或复制它们并更改两个集(旧的和新的)但使用不同的规则。

    <强>更新 重读你的帖子后我明白你想要这样做:

    1. 复制一组记录(有效地复制它们),但修改它们的值。
    2. 修改原始记录集 之前重复它们
    3. 如果是这种情况,我不认为你可以在“两个”查询中做到这一点,因为如果你已经重复,你将无法知道旧行是什么以及新行是什么。

      一个有效的选项是创建一个临时表,在那里复制行(用我提供的查询将它们修改为“新的”)。然后在原始表中执行“更新”(使用相同的WHERE) CLAUSE以确保您正在修改相同的行),使用您想要更新的任何内容更新“旧”值,最后将新的值插回到已修改的原始表(我们称之为“新”)中。 最后,删除临时表。

      呼!

      听起来很奇怪,但除非我们每分钟谈论数以万计的记录,否则这应该是一种快速的操作。

答案 1 :(得分:2)

您可以使用INSERT ... SELECT,这是一个特定于DB2的构造:

INSERT INTO MY_TABLE (LOL, ROTFL, LONGCAT)
SELECT LOL, ROTFL, 'CUSTOM_VALUE'
FROM MY_TABLE
WHERE ID = 1337

然后在同一个事务中,如果要修改原始行,则使用相同的where子句进行更新:

UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337

由于DB2在一个批处理中支持多个命令,因此可以将它们一起批处理:

INSERT INTO MY_TABLE (LOL, ROTFL, LONGCAT)
SELECT LOL, ROTFL, 'CUSTOM_VALUE'
FROM MY_TABLE
WHERE ID = 1337;
UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337;