在Oracle中使用联接更新语句

时间:2017-08-01 20:53:51

标签: oracle join

我需要更新表A中的一列,其结果是表A中的一个字段与表B中的一个字段相乘。 在T-SQL中执行此操作非常简单,但我无法在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);

但我一直都有错误。请问有人帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我通常更喜欢在这种情况下使用以下格式,因为如果表中没有数据(查询提取的临时表),这将确保没有执行更新,而在上面提供的解决方案中如果第二个表中没有记录但第一个表中存在记录,Brian Leach会将新值更新为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)。

更多关于内部联接中的Key Preserved表概念可以在这里找到 https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:548422757486

答案 1 :(得分: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);