Oracle中带有联接的Update语句
我需要用表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 IDOracle中带有联接的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
但我总是出错。有人能帮我吗?@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,如果答案有帮助,请接受: