2017-08-01 6 views
0

テーブルAの1つのフィールドを、テーブルAの1つのフィールドとテーブルBの1つのフィールドの乗算結果で更新する必要があります。 T-SQLでこれを行うのはかなり簡単ですしかし、私はOracleで正しい構文を書くことができません。Oracleでの結合による更新ステートメント

UPDATE TABLE_A SET TABLE_A.COLUMN_TO_UPDATE = (select TABLE_A.COLUMN_WITH_SOME_VALUE * TABLE_B.COLUMN_WITH_PERCENTAGE from TABLE_A INNER JOIN TABLE_B ON TABLE_A.PRODUCT_ID = TABLE_B.PRODUCT_ID AND TABLE_A.SALES_CHANNEL_ID = TABLE_B.SALES_CHANNEL_ID) WHERE TABLE_A.MONTH_ID IN (201601, 201602, 201603);

をしかし、私はエラーを得続ける:私が試した何

。誰も助けてくれませんか?

+4

可能な重複見つけることができます参加[内部でUPDATE文をオラクルに参加](https://stackoverflow.com/questions/2446764/update-statement - with-inner-join-on-oracle) - > Morten Andersonの答えを探す。あなたは質問する前にgoogleする必要があります –

+0

これは、Oracleでも行うのはかなり簡単です。 https://stackoverflow.com/documentation/oracle/8061/update-with-joins#t=201708020102597068665 – mathguy

答えて

0

@ Jayesh Mulwaniが有効なポイントを獲得しました。これは、一致するレコードがない場合、値をnullに設定します。これは望ましい結果である場合とそうでない場合があります。それはない、と何の変化がdesirectされていない場合は、select文に変更することができます。それが唯一の一致するレコードを更新するよう、これは望ましい結果であるならば

coalesce((SELECT table_b.column_with_percentage 
              FROM table_b 
              WHERE table_a.product_id = table_b.product_id AND table_a.sales_channel_id = table_b.sales_channel_id),1) 

を、Jayeshのソリューションは、より効率的になります。

UPDATE table_a 
    SET table_a.column_to_update = table_a.column_with_some_value 
            * (SELECT table_b.column_with_percentage 
             FROM table_b 
             WHERE table_a.product_id = table_b.product_id 
              AND table_a.sales_channel_id = table_b.sales_channel_id) 
WHERE table_a.month_id IN (201601, 201602, 201603); 
+0

これは動作します、ありがとうございます! – AnnaBea

1
Iは、一般的に、これはブライアン・リーチによって提供される上記の溶液に更新する一方、テーブルにデータ(クエリ抽出一時テーブル)がない場合に行わないアップデートはありません確実にするため、このような場合については、以下のフォーマットを使用することを好む

2番目のテーブルにレコードが存在しないが、最初のテーブルに存在する場合はnullとして新しい値。

UPDATE 
(
    select TABLE_A.COLUMN_TO_UPDATE 
    , TABLE_A.PRODUCT_ID 
    , TABLE_A.COLUMN_WITH_SOME_VALUE * TABLE_B.COLUMN_WITH_PERCENTAGE as value 
    from TABLE_A 
    INNER JOIN TABLE_B 
    ON TABLE_A.PRODUCT_ID = TABLE_B.PRODUCT_ID 
    AND TABLE_A.SALES_CHANNEL_ID = TABLE_B.SALES_CHANNEL_ID 
    AND TABLE_A.MONTH_ID IN (201601, 201602, 201603) 
) DATA 
SET DATA.COLUMN_TO_UPDATE = DATA.value; 

このソリューションは、私は一つの製品(ID)のために両方のテーブルに単一の行を期待するので、ここでの問題ではありませんキー保存価値の問題を引き起こす可能性があります。内部でのキー保存表の概念上の

よりのここ https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:548422757486

+0

ありがとう、Jayesh! – AnnaBea

+0

私はあなたの解決策を好きです。私にとっては単純なようですが、私はあなたの解決策をupvotedしています。私は10年以上Oracleに取り組んできましたが、私はこの形式の更新ステートメントに慣れていませんでした。私のツールボックスに追加されました。ありがとう。 –

+0

@AnnaBea、それが役に立ったら答えを受け入れてください:) –

関連する問題