sql - 如何在 Oracle 中组合多个更新语句?

标签 sql oracle

我一直致力于提高存储过程的性能,但由于必须运行四个非常相似的更新,速度明显变慢。

我在 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/

相关文章:

sql - 整数作为 SQL 别名不会出错,但会给出不正确的结果

sql - 为什么运行良好的 View 在 Geoserver 的 native 边界框中得到零值?

oracle - PL/SQL Developer 的可折叠区域

java - 由 : java. sql.SQLException : ORA-01795: maximum number of expressions in a list is 1000? 引起

php - Codeigniter 将查询组合在一个循环中

sql - 如何将表架构和约束复制到不同数据库的表?

php - 如何使用 PHP 从 url 访问 mysql 表中的字段

mysql - 我的表创建中的 CONSTRAINT 语句

java - 在 Hibernate 中创建更新返回查询

java - 如何使用 Java 测试与 Oracle 数据库的连接