2016-03-28 7 views
0

Relativ neu für Oracle. Ich versuche, die Spalten einer Tabelle durch die Spalten einer anderen Tabelle zu ersetzen. Hier ist mein Code:Aktualisieren einer Tabelle mit den Spalten eines anderen

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); 

Ich erhalte die Fehlermeldung:

SQL-Fehler: ORA-01427: einreihige Unterabfrage gibt mehr als eine Zeile

Irgendwelche Ideen, was zu tun?

Antwort

0

Grundsätzlich hat Ihre Tempptnadadustabelle mehr als eine Zeile für mindestens einige der ptnid -Werte und Oracle wird nicht auswählen, welche dieser Zeilen verwendet wird, um das Update für Sie durchzuführen. :)

Zum Beispiel, wenn ich tabelle1 haben als

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

und table2 als

COL1 COL2 
1 
2 
3 
4 

und versuchen und zu aktualisieren TABLE2.COL2 mit so etwas wie:

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

was Wert in Spalte TABLE1.COL2 sollte es für 1 und 4 verwenden? Oracle wird nicht für uns raten und das ist, wenn Sie die ORA-01427 bekommen.

Es könnte so einfach sein wie nur ein willkürlich Kommissionierung mag:

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

aber Sie wollen wahrscheinlich in einigen richtige Logik setzen dort wie:

UPDATE table2 t2 
SET col2 = (SELECT t1.col2 FROM table1 t1 WHERE t1.col1 = t2.col1 AND t1.col3 = 'ENG') 

In Ihrem Fall müssen Sie Holen Sie es so, dass die Unterabfrage in Ihrem Update nur eine Zeile pro Ptnid zurückgibt.

Wenn Sie führen dies:

SELECT ptnid, COUNT(*) 
FROM tempptnaddress 
GROUP BY ptnid 
HAVING COUNT(*) > 1 

es Sie, was ptnids zeigen, dass mehr als eine Zeile in tempptnaddress haben. Der Trick wird sein, herauszufinden, warum es mehr als eine Reihe pro ptnid gibt und wie man die richtige für das Update auswählt.

0

Versuchen Sie, diese

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, Adressenew1 = Adresseold1, Adressenew2 = Adresseold2, Adressenew3 = Adressedrei3, Adressenew4 = Adresseold4

Verwandte Themen