2017-11-11 16 views
0

現在、テーブルAからテーブルBに3つの列を移動する必要があります。既存のデータを新しい列にコピーするには、update joinテーブルスクリプトを使用しています。その後、テーブルAの古い列がドロップされます。結合テーブルを使用したSQL更新レコード

Alter table NewB add columnA integer 
Alter table NewB add columnB integer 

Update NewB 
Set NewB.columnA = OldA.columnA, NewB.columnB = OldA.columnB 
From NewB 
Join OldA on NewB.ID = OldA.ID 

Alter table OldA drop column columnA 
Alter table OldA drop column columnB 

これらのスクリプトでは、新しい列が追加され、既存のデータが新しく作成された列に更新されます。その後、古い列を削除します。

しかし、システムの構造上、データベースを最新にするためにSQLスクリプトを複数回実行する必要があります。

私はIf (Columns Exist) Begin (Alter Add, Update, Alter Drop) Endでしたが、必要な列の存在を確認しました。しかし、次回にスクリプトを実行すると、「更新」クエリで古いテーブルから列が見つからないというエラーが表示されます。スクリプトが最初に実行されたときに列が削除されたためです。

他の解決方法はありますか?

答えて

0

あなたは結合を使用して更新することはできません、しかし、あなたは次のように行うことができます。

Update NewB set NewB.columnA = (select OldA.columnA from OldA where NewB.ID = OldA.ID);

Update NewB set NewB.columnB = (select OldA.columnB from OldA where NewB.ID = OldA.ID);

私はあなたが使用しているデータベースがわからない、データベース内にあります列がテーブルに存在するかどうかを取得することができるシステム・テーブル(たとえば、oracleの場合)All_TAB_COLUMNSにはテーブルのすべての列の情報が含まれているため、次のようにテーブルをヒットできます。

select 1 from ALL_TAB_COLUMNS where TABLE_NAME='OldA' and COLUMN_NAME in ('columnA','columnB');

結果のレコードが空の場合は、指定した列がテーブルに存在しないため、クエリをスキップできます。

0

is column exists小切手に何か問題があります。 DDLとDMLの操作は何度も似ています。列の存在を確認する方法を示していないので、私は何が間違っているか教えてくれません。

とにかく、テーブルに新しい列を追加しています。そのような列が存在するかどうかを調べることができます。そうでない場合はスクリプトを実行し、そうであればスクリプトをスキップします。チェックは次のとおりです:

関連する問題