2009-09-11 77 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