Oracle11g 使用另一个表的列更新表

Oracle11g 使用另一个表的列更新表,oracle11g,Oracle11g,对甲骨文来说相对较新。我试图用另一个表的列替换一个表的列。这是我的密码: update ems.ptnaddress p set (p.ptnid, p.address1,p.address2, p.address3,p.address4) = (select p2.ptnid, p2.address1,p2.address2, p2.address3,p2.address4 from tempptnaddress p2 where p.ptnid = p2.ptnid); 我得到一个错误

对甲骨文来说相对较新。我试图用另一个表的列替换一个表的列。这是我的密码:

update ems.ptnaddress p
set (p.ptnid, p.address1,p.address2, p.address3,p.address4) = 
(select p2.ptnid, p2.address1,p2.address2, p2.address3,p2.address4
from tempptnaddress p2 
where p.ptnid = p2.ptnid);
我得到一个错误:

SQL错误:ORA-01427:单行子查询返回多行


您知道该怎么做吗?

基本上,您的temptnaddress表至少有一行以上的ptnid值,Oracle不会选择这些行中的哪一行来为您进行更新:

例如,如果我将表1作为

COL1    COL2    COL3
1       ONE     ENG
1       UNO     SPA
2       TWO     ENG
3       THREE   ENG
4       FOUR    ENG
4       CUATRO  SPA
表2为

COL1    COL2
1
2
3
4
并尝试使用以下方式更新TABLE2.COL2:

UPDATE table2 t2
SET col2 = (SELECT col2 FROM table1 t1 WHERE t1.col1 = t2.col1)
表1.COL2列中1和4应使用什么值?甲骨文不会为我们猜测,那就是你得到ORA-01427的时候了

这可能和随意挑选一个一样简单,比如:

UPDATE table2 t2
SET col2 = (SELECT col2 FROM table1 t1 WHERE t1.col1 = t2.col2 AND ROWNUM = 1)
但你可能想在这里加入一些适当的逻辑,比如:

UPDATE table2 t2
SET col2 = (SELECT t1.col2 FROM table1 t1 WHERE t1.col1 = t2.col1 AND t1.col3 = 'ENG')
在您的情况下,您需要获取它,以便更新中的子查询每个ptnid只返回一行

如果运行此命令:

SELECT ptnid, COUNT(*) 
FROM tempptnaddress
GROUP BY ptnid 
HAVING COUNT(*) > 1
它将向您显示在tempptnaddress中有多行的PTNID。诀窍是找出为什么每个ptnid有多行,以及如何选择正确的行用于更新。

试试这个

更新从ems.ptnaddress p中选择p.ptnid ptnid1、p.address1 Addressnew1、p.address2 p.address3 p.address4 Addressnew4、p.ptnid ptnid2、p.address1 Addressold1、p.address2 p.address3 Addressold3、p.address4 Addressold4,其中p.ptnid=p2.ptnid设置ptnid1=ptnid2、Addressnew1=Addressold1、Addressnew2=Addressold2,Addressnew3=Addressold3,Addressnew4=Addressold4