質問

テーブルに行を追加するための基礎として使用する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があります。

私が間違っていなければ、これを行いたい:

  1. 一部の値を、選択(" old"と呼ぶもの)からのテーブルに挿入します
  2. 別のレコードセット(「古い」レコードなど)を作成しますが、それらの値を変更します。

または、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」に変更された場合、本当に元の行を変更しますか?この質問に対する答えは、あなたが達成したい正確なタスクに依存しますが、それは私にはまだ明らかではありません。

行を複製して「コピー」を変更する場合は、またはそれらをコピーして両方のセット(古いものと新しいもの)を変更しますが、異なるルールを使用します。

更新 あなたの投稿を読み直した後、あなたはこれをしたいことを理解しています:

  1. レコードのセットを複製(効果的にコピー)しますが、値を変更します。
  2. レコードを複製する前に元のレコードのセットを変更する

もしそうなら、「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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top