0

次のテーブルをクリーンアップするのに役立つ更新クエリを作成するのに助けが必要です。私は各行を手動で行ってきましたが、それは長くて疲れるプロセスです.

テーブル全体を一度に更新する更新クエリを作成する方法はありますか。

The rules:
1. All fields ending with m1 should only contain a value of 'aprn' 
2. All fields ending with m2 should only contain a value of 'pa'
3. If 'pa' does exist in a field ending with m1 then that means that field should be NULL and the value 'pa' should be moved to the m2 column. 


table_a
org_id org_name     a_m1   a_m2    b_m1     b_m2
1       north       aprn   pa      aprn     pa
2       south       null   null    pa       null
3       east        pa     null    pa       null
4       west        null   pa      null     pa


Correct: ORG_ID=1 (a_m1, a_m2, b_m1, b_m2)
Correct: ORG_ID=4 (a_m1, a_m2, b_m1, b_m2)
Correct: ORG_ID=2 (a_m1, a_m2)

Incorrect: ORG_ID=2 (b_m1, b_m2)
Incorrect: ORG_ID=3 (a_m1, a_m2, b_m1, b_m2)
4

2 に答える 2

0
update table_a
set
a_m2 = case when a_m1 = 'pa' or a_m2 = 'pa' then 'pa' end
, b_m2 = case when b_m1 = 'pa' or b_m2 = 'pa' then 'pa' end
, a_m1 = case when a_m1 = 'aprn' then a_m1 end
, b_m1 = case when b_m1 = 'aprn' then b_m1 end

demo を使用した SQL Fiddle

それは確かにあなたのデータセットで機能します。これがうまくいかない場合は、質問に詳細を追加してください。

于 2013-04-20T21:16:41.100 に答える
0

あなたの質問を正しく理解できれば、複数の更新ステートメントが最適であると思われます。データを変更するステートメントで私が好んで行うことの 1 つは、ステートメントをシンプルに保つことです。私は複数のステートメントを書くこと、RDBMS に多くの作業をさせること、遅くすることなどを好みますが、常に正しいことを行います。誤ったデータ変更から回復するのは難しい場合があります。

あなたの基準を完全に理解しているかどうかはわかりませんが、次のようなものです。私が正しいことを理解していれば、1. と 2. の前に 3. を実行する必要がありますか?

  1. update table_a
       set a_m1 = 'aprn'
     where a_m1 = 'pa';
    
  2. update table_a
       set a_m2 = 'pa'
     where a_m2 = 'aprn';
    
  3. update table_a
       set a_m1 = NULL
       set a_m2 = 'pa'
     where a_m1 = 'pa';
    
    update table_a
       set b_m1 = NULL
       set b_m2 = 'pa'
     where b_m1 = 'pa';
    
于 2013-04-20T21:17:07.037 に答える