質問
テーブルに行を追加するための基礎として使用するselectステートメントがあります。 新しい行にはいくつかの列が変更され、元の行も変更する必要があります。
これは1回限りの発生であり、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レコードに対して実行する必要があります。
MDTYPE.MBANKから* MTYPEOT = '2'およびMAVAILS = 'A'を選択します
解決
DrJokepuソリューションは大丈夫ですが、それはあなたが「変更」と呼ぶものに依存します;あなたの質問では、修正されています。つまり、常に2列目の+1を変更しますか?または、それらの変更は「動的」ですか。どの変更を適用するかをランタイムで決定する必要がありますか?
DB2およびその他のSQLの異なる構成(DB2の挿入など)またはクエリのセットを構成できるMS-SQLのSELECT INTOがあります。
私が間違っていなければ、これを行いたい:
- 一部の値を、選択(" old"と呼ぶもの)からのテーブルに挿入します
- 別のレコードセット(「古い」レコードなど)を作成しますが、それらの値を変更します。
または、2番だけを実行したい場合もあります。
数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の正確な関数を覚えていません。)
あなたが言及したあなたの例では、一つの質問が残っています:
&quot; New = A Old = O&quot;
Oldが「O」に変更された場合、本当に元の行を変更しますか?この質問に対する答えは、あなたが達成したい正確なタスクに依存しますが、それは私にはまだ明らかではありません。
行を複製して「コピー」を変更する場合は、またはそれらをコピーして両方のセット(古いものと新しいもの)を変更しますが、異なるルールを使用します。
更新 あなたの投稿を読み直した後、あなたはこれをしたいことを理解しています:
- レコードのセットを複製(効果的にコピー)しますが、値を変更します。
- レコードを複製する前に元のレコードのセットを変更する
もしそうなら、「2」でできるとは思わない。すでに複製されている場合、古い行と新しい行が何であるかを知る方法がないためです。
有効なオプションは、一時テーブルを作成し、そこに行をコピー(&quot;新しい行として変更)して、提供したクエリを使用することです)。次に、元のテーブルで&quot; update&quot;を実行します。 (同じWHERE句を使用して、同じ行を変更していることを確認してください)、&quot; old&quot;を更新します。更新したいものをすべて値に追加し、最終的に元のテーブルに新しい値(「新しい」と呼ばれるもの)を挿入します。 最後に、一時テーブルを削除します。
Phew!
奇妙に聞こえますが、毎分数百万件のレコードについて話さない限り、これは一種の高速操作であるはずです。
他のヒント
DB2固有の構造であるINSERT ... SELECTを使用できます。
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;