首页 > 解决方案 > 我们如何分块执行 SQL Merge 查询?

问题描述

我有一个合并查询,它适用于少数记录(< 500)

Merge into TableA A using TableB B on (UNIQUEID = UNIQUEID) 
  when matched 
    then update 
      set
        A.id = B.id,
  when not matched 
    then insert (
      A.id
    )
    values(
      B.id
    )

大型数据集 ( > 7000 ) 会出现此问题

错误:合并语句 ORA-30926:无法在源中获得一组稳定的行

我希望以块的形式执行合并语句(例如一次 1000 个),以便可以识别数据的确切问题。

标签: sqldatabaseoraclejdbcmerge

解决方案


ORA-30926: 无法在源中获得一组稳定的行

此错误表示数据库无法将 中的一条记录与 中tableA的一条记录匹配tableB。这使得 MERGE 结果不可预测,Oracle 不喜欢不可预测的结果。

UNIQUEID 字段是 TableB 中的主键,因此不可能重复

所以你需要在tableA. 这是一种方法:

select a.uniqueid
       , count(*)
from tablea a
group by a.uniqueid having count(*) > 1

tableB可能出于性能原因,或者验证它tableb.uniqueid实际上与您认为的一样独特,您可能想要加入:

select a.uniqueid
       , count(*)
from tablea a
     join tableb b on b.uniqueid = a.uniqueid
group by a.uniqueid having count(*) > 1

推荐阅读