我需要更新表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);
但我一直都有错误。请问有人帮帮我吗?
答案 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);