Oracle中带有联接的Update语句

Oracle中带有联接的Update语句,oracle,join,Oracle,Join,我需要用表A中的一个字段与表B中的一个字段相乘的结果来更新表A中的一列。 在T-SQL中实现这一点非常简单,但我无法在Oracle中编写正确的语法 我所尝试的: 更新表A 将表A.COLUMN设置为更新= 选择表A.COLUMN\u和某些值*表B.COLUMN\u和百分比 来自表A 内部联接表 表A上的产品ID=表B上的产品ID 和TABLE_A.SALES_CHANNEL_ID=TABLE_B.SALES_CHANNEL_ID 其中,201601、201602、201603中的表A.MONTH

我需要用表A中的一个字段与表B中的一个字段相乘的结果来更新表A中的一列。 在T-SQL中实现这一点非常简单,但我无法在Oracle中编写正确的语法

我所尝试的:

更新表A 将表A.COLUMN设置为更新= 选择表A.COLUMN\u和某些值*表B.COLUMN\u和百分比 来自表A 内部联接表 表A上的产品ID=表B上的产品ID 和TABLE_A.SALES_CHANNEL_ID=TABLE_B.SALES_CHANNEL_ID 其中,201601、201602、201603中的表A.MONTH\u ID


但我总是出错。有人能帮我吗?

@Jayesh Mulwani raised一个有效点,如果没有匹配的记录,这将把值设置为null。这可能是也可能不是期望的结果。如果不是,并且不需要更改,则可以将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);

我通常更喜欢在这种情况下使用以下格式,因为这将确保如果tablequery提取的临时表中没有数据,则不会执行更新,而在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;
此解决方案可能会导致键保留值问题,这在这里不应该是问题,因为我希望两个表中都有一行对应一个productID

有关内部联接中键保留表概念的更多信息,请参见此处

可能重复的->寻找莫顿·安德森的答案。在询问之前,你应该先搜索一下谷歌。在甲骨文中,这也很容易做到。非常感谢你,杰耶什!我喜欢你的解决方案而不是我的,因为我觉得这很简单,我对你的解决方案投了赞成票。虽然我已经在Oracle工作了10多年,但我不熟悉这种形式的update语句。它已添加到我的工具箱中。谢谢。@AnnaBea,如果答案有帮助,请接受: