2009-06-09 9 views
1

フィールドに優先度(1〜5)のテーブルがいくつかあります。ここでの問題は、さまざまなプロジェクトが最高5つ、最高1つのプロジェクトを使用しており、これを調和させることです。 > 5
2 - - > 4
3 - > 3
4 - > 2

1:値を切り替えるためのSQL文

私の簡単なオプションは、一時テーブルを作成し、上のデータをコピーして、この表のように切り替えることです5 - > 1

私はSQLではそれほど良くはありませんが、ステートメントでこれらの値を簡単に切り替える必要があると感じていますが、膨大な量のデータがある場合や、何かが途中で間違ってしまうと、データが混乱することになります。

ちょうど私の一時テーブルソリューションと一緒に行かなければならないのでしょうか、それともSQLでこれを真似るいい方法がありますか? (Oracle 10gが使用されています)

多くの感謝!

+1

あなたはいくつかのプロジェクトを言います - 答えに含まれるクエリにWHERE句を追加することを忘れないでください! – Benjol

+0

ソリューションの仕組みや混乱が懸念される場合は、最初にプロダクトで直ちに実行しないで、変更を行う前にデータをバックアップしてください。監査がある場合は、代わりにこれを使用できます。そうすれば、変更前の情報は、悪化したことが判明した場合はいつでも元に戻すことができます。 – HLGEM

答えて

13

単にあなただけの優先順位が逆転しているため、この、一時テーブル状の第2のテーブルが必要とされていない更新:

update table_2 
set priority = 6-priority; 
+0

それははるかに良いです。 – nickd

+0

OPの中には一部だけが逆転していると述べているので、where句が必要ですか? – HLGEM

+0

ありがとうございました! – StefanE

4

あなたはCASEステートメントを使用することができます

case PRIORITY 
    when 5 then 1 
    when 4 then 2 
    when 3 then 3 
    when 2 then 4 
    when 1 then 5 
    else PRIORITY 
end 

編集:texBlues'ソリューションははるかに優れていますが、数学がきちんとしていない場合にはここに置きます。

0

更新がうまくいかない場合は、「混乱」が発生しないように、トランザクションを使用してください。 tekBluesソリューションを構築する(これに対して+1)。

これは、複数のテーブルを一度に更新する場合に特に有効です。 hainstechがコメントで正しく指摘したように、単一のステートメントは暗黙的に処理されます。

+2

私はOracleユーザーではありませんが、確かに、単一のステートメントは、常に暗黙的または明示的なトランザクションで実行されますか? – ahains

関連する問題