java - 优化 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 来实现,但我不知道该怎么做。
任何帮助,将不胜感激。
解决方案
您可以使用
executeBatch
:在这种情况下,oracle 会自动在输入数组上执行您的 sql 语句你可以绑定一个集合并
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
...
推荐阅读
- python - Python,希望将文本从左向右移动
- php - 如何为初学者开发者构建字典 Web 应用程序
- spring - 是否可以将 Spring Data Rest 配置为使用 id 作为引用而不是 URI?
- reactjs - 跳过第一个 useEffect 渲染自定义钩子
- c# - Fluent-nhibernate 与 .net 核心 NHibernate.Driver.MySqlDataDriver
- c# - 当我按下按钮时,如何制作带有滚动条的标签之类的东西
- java - 关闭应用程序时如何保存 TextViews?
- php - 此路由不支持 PUT 方法。支持的方法:GET、HEAD。(使用资源)
- java - java.lang.IllegalStateException:设置正文参数时名称为空
- javascript - 如何使用电子释放忽略多个目录和文件