2017-08-01 43 views
0

我需要更新表A中的一列,其結果是將表A中的一個字段與表B中的一個字段相乘。 在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

的可能的複製[更新與內聲明加入甲骨文(https://stackoverflow.com/questions/2446764/update-statement -with-inner-join-on-oracle) - >查看Morten Anderson的答案。在詢問之前,您應該谷歌 –

+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

我通常喜歡使用以下格式爲這樣的情況下,因爲這將保證沒有,如果有在表中,而在由Brian裏奇提供的上述溶液將更新任何數據(查詢提取的臨時表)來進行更新如果第二個表中沒有記錄但第一個表中存在記錄,則新值爲空。

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

我喜歡你的解決方案,因爲它對我來說很簡單,我已經提高了你的解決方案。儘管我與Oracle合作了10多年,但我並不熟悉這種更新聲明的形式。它已被添加到我的工具箱中。謝謝。 –

+0

@AnnaBea,如果有幫助,請接受答案:) –