首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-30926 -合并状态

ORA-30926 -合并状态
EN

Stack Overflow用户
提问于 2014-07-24 14:32:55
回答 2查看 1.3K关注 0票数 0

我得到了一个ORA-30926错误。我对此进行了研究,发现这通常是由USING子句中指定的查询中的重复项造成的。

问题是,我正在错误地移除副本,并将其存储在一个温度表(temp_distinct)中,而这反过来又指在MERGE中。下面是我的代码片段:

代码语言:javascript
复制
MERGE INTO name_test nt 
USING (select name from temp_distinct) s 
ON (1=1)
WHEN MATCHED
THEN UPDATE SET nt.fn = s.name, nt.LN = s.name

这是我的桌子的结构:

NAME_TEST

代码语言:javascript
复制
FN    LN
----- -----
Ruc   Rag
Ruc   Ran
Sam   Kum
Ruc   Ran
Ruc   Kum
Ran   Dev
Rag   Agar
Rag   Ran

TEMP_DISTINCT

代码语言:javascript
复制
FN    NUMB NAME  NUM
----- ---- ----- ---
Sam   1    Mark  1
Rag   2    Steve 2
Dev   3    John  3
Kum   4    Dave  4
Ruc   5    Mich  5
Agar  6    Dean  6
Ran   7    Phil  7

因此,如您所见,在USING子句中没有重复。我正在尝试取代NT.FN = S.NAMENT.LN = S.NAME

基本上,我希望将FN中的名称和NAME_TEST表中的LN替换为与TEMP_DISTINCT表不同的名称。最后的产出如下:

代码语言:javascript
复制
FN     LN
------ ------
Mich   Steve
Mich   Phil
Mark   Dave
Mich   Phil
Mich   Dave
Phil   John
Steve  Dean
Steve  Ran
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-24 16:06:44

除了来自@zaratustra的解释之外,您的合并还试图将fnln设置为相同的name值,这样它就不会给出您想要的结果,即使它成功了。在尝试更新fnln时,不能在using子句中使用它们。

如果您的name_test表有一个主键(或至少是唯一的)列,那么您可以在合并中包含这个列,但是您仍然只能在一次传递中正确地更新fnln值。

我不知道你为什么不做一个简单的更新:

代码语言:javascript
复制
update name_test nt
set fn = (select td.name from temp_distinct td where td.fn = nt.fn),
  ln = (select td.name from temp_distinct td where td.fn = nt.ln);

8 rows updated.

select * from name_test;

FN    LN  
----- -----
Mich  Steve 
Mich  Phil  
Mark  Dave  
Mich  Phil  
Mich  Dave  
Phil  John  
Steve Dean  
Steve Phil  
票数 1
EN

Stack Overflow用户

发布于 2014-07-24 14:44:43

您的查询无法执行,因为(1 = 1) oracle无法获得一组稳定的行,为了清楚起见,请检查以下内容:

代码语言:javascript
复制
SQL> create table ttt (name varchar2(20 char));

Table created.

SQL> insert into ttt values('first1');

1 row created.

SQL> insert into ttt values('second2');

1 row created.

SQL> merge into ttt t1 using (select 'name' name from dual) t2 on (1 = 1) when matched then update set t1.name = t2.name;

2 rows merged.

SQL> select * from ttt;

NAME
--------------------
name
name

"t2“子查询中只有一行,合并操作已经成功完成。但是,如果您的子查询获得多行,我将遇到ORA-30926:

代码语言:javascript
复制
SQL> merge into ttt t1 using (select 'name' || level name from dual connect by rownum < 4) t2 on (1 = 1) when matched then update set t1.name = t2.name;
merge into ttt t1 using (select 'name' || level name from dual connect by rownum < 4) t2 on (1 = 1) when matched then update set t1.name = t2.name
           *
ERROR at line 1:
ORA-30926: unable to get a stable set of rows in the source tables


SQL> select * from ttt;

NAME
--------------------
name
name

SQL>

Oracle不知道哪些值必须与行相关联。您的结果集不明确。要能够执行此合并,您必须具备正常的条件,例如:

代码语言:javascript
复制
SQL> alter table ttt add id number(10);

Table altered.

SQL> update ttt set name = 'name1', id = rownum;

2 rows updated.

SQL> select * from ttt;

NAME                         ID
-------------------- ----------
name1                         1
name1                         2

SQL> merge into ttt t1 using (select 'name' name, level id from dual connect by rownum < 4) t2 on (t1.id = t2.id) when matched then update set t1.name = t2.name;

2 rows merged.

SQL> select * from ttt;

NAME                         ID
-------------------- ----------
name                          1
name                          2

SQL>

如您所见,"ttt“表已成功合并。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24936612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档