update从a表的某个字段更新到b表的某个字段的问题

时间:2021-03-17 14:56:55
这个sql在执行的时候老是报错ora-01427:single-row subquery returns more than row,编译不通过。

第一个表:temp_test表的库表创建语法说明如下:
CREATE TABLE TEMP_TEST
(
  AY_OTHER_PARTY  VARCHAR2(20 BYTE),
  AY_LOG_ID       INTEGER                       NOT NULL
)
TABLESPACE CC_DATA
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            MINEXTENTS       1
            MAXEXTENTS       2147483645
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;
select * from temp_jiang;
第二个表:temp_jiang表的库表说明如下:
CREATE TABLE TEMP_JIANG
(
  AY_CALLED   VARCHAR2(50 BYTE),
  AY_CALL_ID  VARCHAR2(50 BYTE)
)
TABLESPACE CC_DATA
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            MINEXTENTS       1
            MAXEXTENTS       2147483645
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;

update temp_jiang a set a.ay_called = (select b.ay_other_party from temp_test b where a.ay_call_id = b.AY_LOG_ID);
执行以上语句以后,toad报错如下:ora-01427:single-row subquery returns more than row

12 个解决方案

#1


update temp_jiang a set a.ay_called = (select b.ay_other_party from temp_test b where a.ay_call_id = b.AY_LOG_ID);



其中的select b.ay_other_party from temp_test b where a.ay_call_id = b.AY_LOG_ID返回的记录多于1条吧,这样就会报错ingle-row subquery returns more than row,你可以检查一下,

改为这样:
update a set a.ay_called =  b.ay_other_party from temp_jiang a, temp_test b where a.ay_call_id = b.AY_LOG_ID

#2


update temp_jiang a set a.ay_called = b.ay_other_party 
from temp_test b where a.ay_call_id = b.AY_LOG_ID;

#3


update a set a.ay_called = b.ay_other_party 
from temp_jiang a 
  join temp_test b 
    on a.ay_call_id = b.AY_LOG_ID;

#4


update
 a 
set
 a.ay_called = b.ay_other_party 
from
 temp_jiang a ,temp_test b 
where 
 a.ay_call_id = b.AY_LOG_ID

#5


各位大侠,提示一下,sql中的updte语句不能直接带 from 语句啊 楼上的各位提供的都是直接带from的语句

#6


学习一下

#7


楼上的 update语句中直接带 from 语句 报错啊:ora-00900:invalid SQL statement

#8


sql语句可以带FROM,好像ACEESEE数据库不能

#9


oracle的也不能直接带from啊

#10


引用 9 楼 micklejiang 的回复:
oracle的也不能直接带from啊

oracle的话则如下:
--如果所有的记录都匹配

update temp_jiang set ay_called = (select ay_other_party from temp_test where temp_test.AY_LOG_ID = temp_jiang.ay_call_id);

--如果存在不匹配的记录。
update temp_jiang set ay_called = (select ay_other_party from temp_test where temp_test.AY_LOG_ID = temp_jiang.ay_call_id) 
where ay_call_id in (select distinct AY_LOG_ID from temp_test) ;

#11


10楼的肯定是高手中的高手,能考虑异常情况,不至于造成数据紊乱!谢谢!

#12


但是不知道是怎么回事,依然报:ora-01427:single_row subquery returns more than one row

该现象怪异的很,在另一个oracle版本一样的数据库里面执行这个语句,可以通过。但是在本数据库中执行报以上错误。不知道如何解决单行对多行的错误。请指教!

#1


update temp_jiang a set a.ay_called = (select b.ay_other_party from temp_test b where a.ay_call_id = b.AY_LOG_ID);



其中的select b.ay_other_party from temp_test b where a.ay_call_id = b.AY_LOG_ID返回的记录多于1条吧,这样就会报错ingle-row subquery returns more than row,你可以检查一下,

改为这样:
update a set a.ay_called =  b.ay_other_party from temp_jiang a, temp_test b where a.ay_call_id = b.AY_LOG_ID

#2


update temp_jiang a set a.ay_called = b.ay_other_party 
from temp_test b where a.ay_call_id = b.AY_LOG_ID;

#3


update a set a.ay_called = b.ay_other_party 
from temp_jiang a 
  join temp_test b 
    on a.ay_call_id = b.AY_LOG_ID;

#4


update
 a 
set
 a.ay_called = b.ay_other_party 
from
 temp_jiang a ,temp_test b 
where 
 a.ay_call_id = b.AY_LOG_ID

#5


各位大侠,提示一下,sql中的updte语句不能直接带 from 语句啊 楼上的各位提供的都是直接带from的语句

#6


学习一下

#7


楼上的 update语句中直接带 from 语句 报错啊:ora-00900:invalid SQL statement

#8


sql语句可以带FROM,好像ACEESEE数据库不能

#9


oracle的也不能直接带from啊

#10


引用 9 楼 micklejiang 的回复:
oracle的也不能直接带from啊

oracle的话则如下:
--如果所有的记录都匹配

update temp_jiang set ay_called = (select ay_other_party from temp_test where temp_test.AY_LOG_ID = temp_jiang.ay_call_id);

--如果存在不匹配的记录。
update temp_jiang set ay_called = (select ay_other_party from temp_test where temp_test.AY_LOG_ID = temp_jiang.ay_call_id) 
where ay_call_id in (select distinct AY_LOG_ID from temp_test) ;

#11


10楼的肯定是高手中的高手,能考虑异常情况,不至于造成数据紊乱!谢谢!

#12


但是不知道是怎么回事,依然报:ora-01427:single_row subquery returns more than one row

该现象怪异的很,在另一个oracle版本一样的数据库里面执行这个语句,可以通过。但是在本数据库中执行报以上错误。不知道如何解决单行对多行的错误。请指教!