使用另一个

时间:2016-03-28 23:57:20

标签: oracle11g

Oracle相对较新。我试图用另一个表的列替换一个表的列。这是我的代码:

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:单行子查询返回多行

有关做什么的任何想法?

2 个答案:

答案 0 :(得分:0)

基本上你的tempptnaddress表至少有一行ptnid值,Oracle不会选择用哪一行来为你做更新。 :)

例如,如果我将table1作为

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

和table2为

COL1    COL2
1
2
3
4

并尝试使用以下内容更新TABLE2.COL2:

UPDATE table2 t2
SET col2 = (SELECT col2 FROM table1 t1 WHERE t1.col1 = t2.col1)

TABLE1.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中有多行的ptnids。诀窍是找出为什么每个ptnid有多行,以及如何选择正确的行用于更新。

答案 1 :(得分:0)

试试这个

UPDATE(SELECT 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 FROM ems.ptnaddress p,tempptnaddress p2 WHERE p.ptnid = p2.ptnid)SET ptnid1 = ptnid2,Addressnew1 = Addressold1,Addressnew2 = Addressold2,Addressnew3 = Addressold3,Addressnew4 = Addressold4