2016-05-08 11 views
1

の行の値に基づいて、一つのテーブルの列の名前を変更します。コラムREFVALUEとは、私は2つのテーブルを持って例えば別のテーブル

Q1 Q2 Q3 Map_id 
11 23 34 11101 
22 22 22 11102 

表2は、実際値

refvalue actualvalue  Map_id 
    Q1 Remaining   11101 
    Q2 Utilized  11101 
    Q3 Actual   11101 
    Q1 Remaining1  11102 
    Q2 Utilized1 11102 
    Q3 Actual1 11102 

は、今私は表2の値を対応する表1のCOLUMN_NAMEを交換したいです。

例:

select Q1 as "Remaining", Q2 as "Utilized", Q3 as "Actual" 
from Table1; 

今、これは、ハード、それが論理的にする方法を、コード化されましたか?私はこれにどのように接近するのか分かりませんし、私は新しくオラクルにいます。

バージョン:Oracle11g クライアント:これは非常に悪い関係の設計であると私はあなたがそれを変更することをお勧めしますがヒキガエル

+0

これは悪いリレーションデザインです!これを変更する必要があります。 – sagi

+0

@sagi - これはビジネス要件です。我々はそれを変更することはできません。これは、クライアントのレガシーシステムがどのように変わってもかまいません。あなたは解決策を教えてくれますか? –

+0

リレーションシップのために別の列を追加する必要があります。これにより、今後多くのエラーが発生します。これは 'PL/SQL'で行うことができますが、テーブルを正しく結合することができないと、読めないコードが長くなります! – sagi

答えて

1

が、それは、PL/SQLでこのような何かを行うことができます(多分それを少し調整する)

select 'SELECT Q1 as '||MAX(CASE WHEN t2.ref_value = 'Q1' THEN t2.actual_value END)||', 
       Q2 as '||MAX(CASE WHEN t2.ref_value = 'Q2' THEN t2.actual_value END)||', 
       Q3 as '||MAX(CASE WHEN t2.ref_value = 'Q3' THEN t2.actual_value END) 
     ||'FROM Table1' 
FROM Table1 t1 
INNER JOIN Table2 ON(1=1) 

これは、ログテーブル、DDL_LOG_TABを作成

+0

これは列の値を与えません。とにかく私も質問を更新しました。 –

+0

@AnkurVermaこれは値を持って来るはずではありません。生成する出力はコピーして実行する必要があるSQLコードです。 – sagi

0
  1. を必要とするSQLを生成します。
  2. 暗黙カーソルを使用してTable2のレコードをループします。
  3. 表2の各レコードについて、文字列ステートメント "ALTER TABLE TABLE1 RENAME COLUMN rec.refvalue TO rec.actualvalue"を作成します。ここで、recは暗黙カーソルの各レコードを参照します。
  4. ループ内で、生成された各ステートメントをDDL_LOG_TABに挿入します。

新しいDDL_LOG_TABに必要なすべてのDDLがあります。 SQLを選択し、動的SQLとして実行するだけです。

実行タイムスタンプ(開始および終了TS)、エラーメッセージ、または成功フラグを保持するために、この新しいテーブルを即座に作成することさえできます。将来、このテーブルは、

のように使用できます。任意の種類のDDLを生成し実行する。 b。年代順に実行されるDDLの過去の履歴を参照してください。 c。 DDLエラーが発生して実行が停止した場合は、エラーを修正して、失敗の時点から実行権を再開することができます。

これは今後も役立ちます。がんばろう。

+0

彼はカラム名を変更しないように頼んだので、それらを選択するように頼んだ。 – sagi

関連する問題