【问题标题】:How can we execute SQL Merge query in chunks?我们如何分块执行 SQL Merge 查询?
【发布时间】:2019-05-07 04:36:20
【问题描述】:

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

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)会出现此问题

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

我希望以块的形式执行合并语句(比如一次 1000 条),以便确定数据的确切问题。

【问题讨论】:

  • @a_horse_with_no_name 我知道这是一个数据问题,这就是我想分块执行它的原因。每次发生数据问题时手动输入约 1 万条记录是不切实际的
  • 你想达到什么目的?您想在异常发生之前处理尽可能多的记录吗?在这种情况下,我建议使用带有 LIMIT 的 BULK COLLECT 来获取您想要处理的所有 ID,然后再获取 FOR ALL。另一个解决方案是DML Error Logging
  • “我希望以块的形式执行合并语句(例如一次 1000 条),以便可以识别数据的确切问题。” - 不一定是这样您识别数据问题。基本上你需要找到重复的记录,因为一张表中的UNIQUEID 不是另一张表中的UNIQUE。使用this 之类的查询来识别哪些记录是重复的,并在继续之前决定必须对它们做什么。然后,您可以相应地更改您的 MERGE 查询。
  • 我已经试过了,@KaushikNayak UNIQUEID 字段是 TableB 中的主键,所以在 TableA 中插入数据时不可能出现重复,因为错误发生在执行的中途,错误的记录没有被插入,因此我无法识别它
  • 向我们展示您尝试识别重复项的确切查询,您应该基本上检查 TableA 中的重复项,匹配 TableB 中的唯一 ID。

标签: sql database oracle jdbc merge


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多