我一直致力于提高存储过程的性能,但由于必须运行四个非常相似的更新,速度明显变慢。
我在 MySql 中找到了有关类似问题的信息,这很有帮助,但我无法实现我所学到的知识,也许 Oracle 的操作方式不同。
我尝试过的事情包括:通过合并进行批量插入,创建辅助 temp_table 并完全不使用临时表,但没有任何改进。
作为 Oracle 新手,我完全有可能采用了错误的方式。
任何建议、答案或答案的指示将不胜感激,因为我已经没有想法了,现在除了暴力和无知之外什么也没有。
UPDATE TEMP_TABLE TI SET T.ItemPrice_One =
(
SELECT ItemPrice
FROM Temp.View_Items V
WHERE V.Item_Name = 'Item_Name_One'
AND V.ID = T.ID
AND V.Date = T.Date
);
UPDATE TEMP_TABLE TI SET T.ItemPrice_Two =
(
SELECT ItemPrice
FROM Temp.View_Items V
WHERE V.Item_Name = 'Item_Name_Two'
AND V.ID = T.ID
AND V.Date = T.Date
);
UPDATE TEMP_TABLE TI SET T.ItemPrice_Three =
(
SELECT ItemPrice
FROM Temp.View_Items V
WHERE V.Item_Name = 'Item_Name_Three'
AND V.ID = T.ID
AND V.Date = T.Date
);
最佳答案
您想要做的本质上是一个透视操作 - 将多个行值转换为单行中的多个列值。下面是一种使用 Oracle 中常见技术进行数据透视查询的方法(未经测试,但我认为它应该按原样工作)。从版本 11g 开始,有一个内置的 PIVOT 操作,但我还没有真正研究过它——它可能是一种更直接的方法来完成您需要的操作。
UPDATE TEMP_TABLE TI SET ( T.ItemPrice_One, T.ItemPrice_Two,T.ItemPrice_Three ) =
(
SELECT
MAX( CASE WHEN V.Item_Name='Item_Name_One' THEN ItemPrice ELSE NULL END ) Item_Price_One,
MAX( CASE WHEN V.Item_Name='Item_Name_Two' THEN ItemPrice ELSE NULL END ) Item_Price_Two,
MAX( CASE WHEN V.Item_Name='Item_Name_Three' THEN ItemPrice ELSE NULL END ) Item_Price_Three
FROM Temp.View_Items V
WHERE V.ID = T.ID
AND V.Date = T.Date
);
关于sql - 如何在 Oracle 中组合多个更新语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9165261/