You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle数据库更新报错ORA-30926:源表无法获取稳定行集求助

解决ORA-30926: unable to get a stable set of rows in the source tables错误

错误原因

这个报错的核心是源表mdm_tableau_events_test中存在重复的ID值——执行Merge操作时,目标表mdm_tableau_events_copy里的某一行会匹配到源表的多条记录,Oracle无法确定用哪条记录的字段值完成更新,因此抛出该错误。

解决步骤

1. 验证重复ID

先执行以下SQL确认源表中的重复ID:

SELECT ID, COUNT(*) AS duplicate_count
FROM mdm_tableau_events_test
GROUP BY ID
HAVING COUNT(*) > 1;

这条语句会列出所有重复的ID及其出现次数,帮你定位问题数据。

2. 处理重复数据的两种方案

方案一:清理源表的重复数据

直接删除源表中多余的重复记录,保留你需要的那一条:

  • 若有时间字段(如DATE_USE),保留最新的记录:
DELETE FROM mdm_tableau_events_test s
WHERE EXISTS (
    SELECT 1 
    FROM mdm_tableau_events_test s2
    WHERE s2.ID = s.ID
    AND s2.DATE_USE > s.DATE_USE
);
  • 若无时间字段,用ROW_NUMBER()函数标记并删除重复项:
DELETE FROM mdm_tableau_events_test
WHERE (ID, ROWID) IN (
    SELECT ID, ROWID
    FROM (
        SELECT ID, ROWID,
               ROW_NUMBER() OVER (PARTITION BY ID ORDER BY 1) rn
        FROM mdm_tableau_events_test
    )
    WHERE rn > 1
);

注:ORDER BY 1可替换成你需要的排序逻辑(比如按FULL_NAME),确保保留正确的记录。

方案二:在Merge语句中直接去重

如果不想修改源表,可在Merge的USING子句中先对源表数据去重,再执行更新:

merge into mdm_tableau_events_copy t
using (
    SELECT ID, FULL_NAME, PROJECT_NAME, EVENTS, DATE_USE, COMPANY, WORKBOOK
    FROM (
        SELECT ID, FULL_NAME, PROJECT_NAME, EVENTS, DATE_USE, COMPANY, WORKBOOK,
               ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE_USE DESC) rn
        FROM mdm_tableau_events_test
    )
    WHERE rn = 1
) s
on (t.ID = s.ID)
when matched then update set 
    t.FULL_NAME = s.FULL_NAME, 
    t.PROJECT_NAME = s.PROJECT_NAME, 
    t.EVENTS = s.EVENTS, 
    t.DATE_USE = s.DATE_USE, 
    t.COMPANY = s.COMPANY, 
    t.WORKBOOK = s.WORKBOOK;

这里ORDER BY DATE_USE DESC表示取每个ID对应的最新记录,你可根据实际需求调整排序字段。

内容的提问来源于stack exchange,提问作者Truex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:15:03