DB2 SQL 根据其他行添加行

Joe*_*eOD 4 sql db2

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

这是一次性发生的情况,如果有帮助,可以将数据库脱机。

有任何想法吗?

谢谢,乔

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

说明 更新

MBANK 表

       |中 |MAGN|MAAID|MTYPEOT| MAVAILS|MUSER|MTS
    |65 | 9| 3| 2| A|姓名|20090909
    |65 | 10| 0| 2| A|姓名|20090910
改变|相同 | +1| 到 0| 相同|新 = 旧 = O|相同 |时间戳

这将必须在一个选择上为大约 4000 条记录完成。

select * from MDSTD.MBANK where MTYPEOT = '2' and MAVAILS = 'A'

Mar*_*ini 5

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

在 DB2 和任何其他 SQL 中都有不同的构造(如 DB2 中的插入)或 MS-SQL 的 SELECT INTO,它们将允许您构造一组查询。

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

  1. 将一些值插入来自选择的表中(您称之为“旧”)
  2. 创建另一组记录(如“旧”记录)但修改它们的值。

或者,也许您只想做第 2 项。

数字 1 很简单,因为 Dr.Jokepu 已经向您展示了:

INSERT INTO <table> (values) SELECT "values" FROM <anotherTable>;
Run Code Online (Sandbox Code Playgroud)

第 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'
Run Code Online (Sandbox Code Playgroud)

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

一个问题仍然存在,在你提到的例子中:

“新 = 旧 = O”

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

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

更新 重读您的帖子后,我知道您想这样做:

  1. 复制一组记录(有效地复制它们)但修改它们的值。
  2. 复制之前修改原始记录集

如果是这种情况,我认为您不能在“两个”查询中执行此操作,因为如果您已经复制了,您将无法知道旧行是什么,新行是什么。

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

呼!

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