微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优化 n^2 循环内的合并查询

如何解决优化 n^2 循环内的合并查询

我有一个合并查询,需要为请求 ArrayList 中的每一天和 sessionType 组合执行一次。我正在使用 nativeQuery 来执行它。

MERGE INTO TABLE_A A
    USING 
    (
    SELECT
    :description AS DESCRIPTION,:sessionType AS SESSION_TYPE,:day AS DAY,:flag1 AS FLAG1,:flag2 AS FLAG2,FROM DUAL) AS SOURCE
    ON (SOURCE.DESCRIPTION=
        A.DESCRIPTION AND SOURCE.DAY=
        A.DAY
        )
    WHEN MATCHED THEN
        UPDATE SET 
        FLAG1=SOURCE.FLAG1,FLAG2=SOURCE.FLAG2  
    WHEN NOT MATCHED THEN
        INSERT (
        DESCRIPTION,SESSION_TYPE,DAY,FLAG1,FLAG2
        )
        VALUES (
        SOURCE.DESCRIPTION,SOURCE.SESSION_TYPE,SOURCE.DAY,SOURCE.FLAG1,SOURCE.FLAG2    
        );

有没有一种方法可以清除源数据(两个 ArrayList,一个带有日期范围而不是一天,另一个带有所有会话类型),这样我就可以只执行一次合并?有人告诉我这可以使用 WITH 来实现,但我不知道该怎么做。

任何帮助将不胜感激。

解决方法

  1. 你可以使用executeBatch:在这种情况下oracle会自动在输入数组上执行你的sql语句

  2. 您可以像这样绑定一个集合并在 table() 中使用它:

MERGE INTO TABLE_A A
    USING 
    (
    SELECT *
    FROM table(:bind_collection)
    ) AS SOURCE
    ON (SOURCE.DESCRIPTION=
        A.DESCRIPTION AND SOURCE.DAY=
        A.DAY
        )
    WHEN MATCHED THEN
        UPDATE SET 
        FLAG1=SOURCE.FLAG1,FLAG2=SOURCE.FLAG2  
    WHEN NOT MATCHED THEN
    ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。