首页 > 解决方案 > 优化 n^2 循环内的合并查询

问题描述

我有一个合并查询,需要为请求 ArrayList 中的 day 和 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 来实现,但我不知道该怎么做。

任何帮助,将不胜感激。

标签: javasqloraclesql-mergenativequery

解决方案


  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
    ...

推荐阅读