【问题标题】:ORA-30926: unable to get a stable set of rows in the source tables in merge query in oracleORA-30926: 在 oracle 的合并查询中无法在源表中获得一组稳定的行
【发布时间】:2020-06-30 14:42:56
【问题描述】:

我真的不明白为什么我在ORA-30926: unable to get a stable set of rows in the source tables 中提供了distinct 子句,因为我在merge 查询中提供了distinct 子句,并且BB_TST_HISTORY 具有适当的唯一约束。

merge into bb_tst_history h
using (select distinct r.ausuebungsbezeichnung
       from   bb_tst_rollup r
       join   ( select root, boerse, security_typ
                from   bb_export_filter
                minus
                select root, boerse, security_typ
                from   bb_tst_exception
              ) e
              on   r.root = e.root
              and  r.security_typ = e.security_typ
              and  r.boerse = e.boerse
      ) s
on (s.root = h.root and s.security_typ = h.security_typ and s.boerse = h.boerse)
when matched then
    update set h.ausuebungsbezeichnung = s.ausuebungsbezeichnung
when not matched then
    insert values (s.ausuebungsbezeichnung);

【问题讨论】:

  • 抱歉我已经编辑了我的查询...实际上我在选择查询中使用了很多列并删除了其他部分的 coulmns..所以它的错字
  • s.roots.security_typs.boerse 的组合必须是唯一的。 (s 只返回 ausuebungsbezeichnung,所以不太清楚发生了什么。)

标签: sql oracle merge


【解决方案1】:

USING 子句中的匹配条件必须有一条记录。

因此您可以在USING 子句中使用GROUP BYMAX,如下所示:

MERGE INTO BB_TST_HISTORY H
USING (
          SELECT MAX(R.AUSUEBUNGSBEZEICHNUNG) AS AUSUEBUNGSBEZEICHNUNG, 
                 R.ROOT, R.SECURITY_TYP, R.BOERSE
            FROM BB_TST_ROLLUP R
            JOIN (
              SELECT ROOT, BOERSE, SECURITY_TYP
                FROM BB_EXPORT_FILTER
              MINUS
              SELECT ROOT, BOERSE, SECURITY_TYP
                FROM BB_TST_EXCEPTION
          ) E
          ON R.ROOT = E.ROOT
             AND R.SECURITY_TYP = E.SECURITY_TYP
             AND R.BOERSE = E.BOERSE
         GROUP BY R.ROOT, R.SECURITY_TYP, R.BOERSE
      ) S ON ( S.ROOT = H.ROOT
   AND S.SECURITY_TYP = H.SECURITY_TYP AND S.BOERSE = H.BOERSE )
WHEN MATCHED THEN UPDATE
   SET H.AUSUEBUNGSBEZEICHNUNG = S.AUSUEBUNGSBEZEICHNUNG
WHEN NOT MATCHED THEN
INSERT VALUES ( S.AUSUEBUNGSBEZEICHNUNG );

【讨论】:

  • 我运行了下面答案建议的选择查询,它没有返回任何行,所以这意味着查询不会产生多个重复的行...
【解决方案2】:

发生此错误是因为您在源中获得了不止一行用于连接列。解决此问题的最佳方法是识别导致问题的那些记录。下面的 SQL 可以给你那些记录 -

select root, security_typ, boerse, count(1) from
(select distinct r.AUSUEBUNGSBEZEICHNUNG from BB_TST_ROLLUP r,      
          (select ROOT, BOERSE, SECURITY_TYP from BB_EXPORT_FILTER minus 
select ROOT, BOERSE, SECURITY_TYP from BB_TST_EXCEPTION)) 
group by root, security_typ, boerse having count(1) > 1;

您需要更新“ON”子句中的附加连接条件来解决此问题。

更新了合并语句 -

merge into BB_TST_HISTORY h   using  
    (    select ROOT, BOERSE, SECURITY_TYP, AUSUEBUNGSBEZEICHNUNG from (select distinct r.AUSUEBUNGSBEZEICHNUNG from BB_TST_ROLLUP r       
        join     
          (select ROOT, BOERSE, SECURITY_TYP from BB_EXPORT_FILTER minus 
select ROOT, BOERSE, SECURITY_TYP from BB_TST_EXCEPTION))) e       
        on      r.root=e.root and r.security_typ=e.security_typ and r.boerse=e.boerse  ) s 
on (s.root=h.root and s.security_typ=h.security_typ and s.boerse=h.boerse) 
        when matched then   update set h.AUSUEBUNGSBEZEICHNUNG = s.AUSUEBUNGSBEZEICHNUNG
        when not matched then   insert values (s.AUSUEBUNGSBEZEICHNUNG); 

【讨论】:

  • 查询抛出错误,因为 group by 子句附近缺少关键字...
  • 谢谢。 SQL 中缺少 ')'。我纠正了它。我已经从问题中获取了源 SQL。我注意到它会产生一个笛卡尔,因为此 SQL 中缺少连接条件。
  • 它现在仍然抛出同样的错误,你已经添加了额外的))
  • 是的 [代码:905,SQL 状态:42000] ORA-00905:缺少关键字
  • 现在可以试试更新SQL吗?如果错误仍然存​​在,请发布错误消息。
猜你喜欢
  • 1970-01-01
  • 2021-08-05
  • 2014-03-23
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多