2009-09-11 61 views
3

我有一个select语句,我想用它作为将更多行添加到表的基础。 新行将有一些列被修改,并且原始行也必须被改变。DB2 SQL根据其他行添加行

这是一次性发生,如果有帮助,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记录。

SELECT * FROM MDSTD.MBANK其中MTYPEOT = '2' 和MAVAILS = 'A'

+0

你能解释一下你的想法吗?一点样本会有帮助。您可以使用SELECT INTO(并根据需要塑造select/into),但如果需要修改“原始”表,则需要DB2中的存储过程。 – 2009-09-11 10:58:06

回答

3

DrJokepu解决方案是好的,但这取决于你在你的问题中所称的“变更”,是固定的。 I.e .:你是否总是为第二列改变+1?还是那些变化是“动态的”,你必须决定运行哪种变更来应用?

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

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

  1. 插入一些值到一个表,来自选择(你所说的“老”)
  2. 创建另一组的记录(像“老”),但修改它们的值。

或者,也许你只想做号码2

1号很容易,博士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的确切功能)。

还有一个问题,在你的榜样,你提到的:

“新= A旧= O”

如果旧变为“O”,那么你真的想改变原始行?这个问题的答案取决于你想要完成的确切任务,但对我而言仍然不清楚。

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

UPDATE 重读你的文章,我知道后,你想这样做:

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

如果是这样的话,我不认为你可以做到这一点在“两节”查询,因为你没有办法知道旧行是什么,如果你已经复制了新行,新行是什么。

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

唷!

听起来不可思议,但除非我们谈论的每分钟记录不计其数,这应该是一种快速的操作的。

2

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

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

然后在相同的交易,你做同样的where子句的更新,如果你婉修改原始行:由于DB2支持单个批次的多个命令

UPDATE MY_TABLE 
SET LOL = 9000 
WHERE ID = 1337 

,可以批量他们toget她:

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; 
+1

OP没有说旧的和新的行可以通过ID来标识,因此如果同一个WHERE子句返回相同的行(加上新插入的行),他将无法更新“原始集合”。 – 2009-09-11 15:30:04