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:单行子查询返回多行
有关做什么的任何想法?
答案 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