2016-03-28 20 views
0

Oracle için oldukça yeni. Bir tablonun sütunlarını bir diğerinin sütunlarıyla değiştirmeye çalışıyorum.Tablonun başka bir sütun ile güncellenmesi

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

ben hata alıyorum:

SQL Hatası: ORA-01427: Tek sıralı alt sorgu ne yapacağını Herhangi bir fikir bir satırda

fazla döner İşte benim kodudur?

cevap

0

Temel olarak tempptnaddress tablonuz, ptnid değerlerinin en azından bir kısmı için birden fazla satıra sahiptir ve Oracle, bu satırlardan hangisini sizin için güncelleştirmeyi yapmak için kullanacağını seçmeyecektir. :) Mesela

, ben varsa tablo1 gibi bir şey kullanarak

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

ve tablo2

COL1 COL2 
1 
2 
3 
4 

olarak ve denemek ve güncelleme TABLE2.COL2 olarak:

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

neyi TABLE1.COL2 sütunundaki değer 1 ve 4 için kullanılmalı mı? Oracle bizim için tahmin etmeyecek ve ORA-01427'yi aldığınızda.

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

ama muhtemelen gibi bazı uygun mantık koymak istiyorum:

sadece birini seçmek gibi bu kadar kolay olabilir keyfi gibi Senin durumunda

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

yapmanız gerekenler güncellemenizdeki alt sorgu, yalnızca ptnid başına bir satır döndürecek şekilde olsun.

Bu çalıştırırsanız:

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

o size gösterecektir neyi tempptnaddress birden fazla satır var ptnids. Hile, ptnid başına birden fazla satırın neden olduğunu ve güncelleme için doğru olanı nasıl seçeceğinizi bulmak olacaktır.

0

bu

GÜNCELLEME (SEÇ p.ptnid ptnid1, p.address1 Addressnew1, p.address2 p.address3 p.address4 Addressnew4, p.ptnid ptnid2, p.address1 Addressold1, p.address2 p.address3 deneyin Addressold3, p.address4 adres_dp_address p, tempptnaddress p2 WHERE p.ptnid = p2.ptnid) ptnid1 = ptnid2, Addressnew1 = Adresold1, Addressnew2 = Adresold2, Adresnew3 = Adresold3, Adresnew4 = Adresold4

İlgili konular