我们如何分块执行SQL Merge查询?

时间:2018-12-05 15:03:41

标签: sql database oracle jdbc 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:无法在源中获得稳定的行集

我希望将merge语句分块执行(一次说1000),以便可以识别出数据的确切问题。

1 个答案:

答案 0 :(得分:0)

  

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