2010-06-22 12 views
13

Lütfen dikkat: I am Soruyu yanıtlamak istiyorum. Bu sorunun, veritabanının yetersiz şekilde ayarlandığı anlamına geldiğini biliyorum. Bu yüzden tablonun kurulma şeklini değiştirmeyi öneren cevapları oylayacağım.Oracle: bir alanı güncellerken satır kopyala

Tek bir değeri değiştirirken, bir grup satırı çoğaltmam gerekiyor. , name ve col1 kopyalanan vardır tablosunda yeni bir giriş oluşturmak col2 is null bu tablodaki tüm girişler için

name col1 col2 
dave a nil 
dave a a 
sue b nil 
sue b a 
same c 5 

IE ve col2a geçerli:

name col1 col2 
dave a nil 
sue b nil 
sam c 5 

haline gelmesi gerekmektedir.

+0

Ara sıra "nil" ifadesiyle "NULL" demek istiyor musunuz? – tvCa

cevap

17

Kullanım: ne name veya col1 sütunları birincil anahtar veya ikisinden biri üzerinde benzersiz bir kısıtlama var farz ediyor

INSERT INTO table 
    (name, col1, col2) 
SELECT t.name, t.col1, 'a' 
    FROM TABLE t 
WHERE t.col2 IS NULL 

.

+0

Önceki yorum silindi: Hatamı buldum. Evet, işe yaradı. Teşekkürler! –

+3

Bu kod, tablo sütunlarının listesini tekrarlamayı gerektirir ve tabloya bir sütun eklendiğinde kesilir. İlginç olmayan sütunları listelemeden bunu yapmanın bir yolu var mı? –

+0

Kevincline Bkz. Http://stackoverflow.com/a/28278824/1611055 –

3

Yapar mı?

INSERT INTO yourtable 
     (SELECT name, col1, 'a' 
      FROM yourtable 
     WHERE col2 is NULL); 
+0

+1 iyi cevap, aslında benim durumumda çalışmıyor. Sadece tablodaki bazı alanları dolduruyorum. –

+0

Tabloda daha fazla sütun varsa, ancak bir ORA hatasıyla karşılaşır. –

+0

Yup, varsayım, tablodaki örnekte sütunlar vardı. – DCookie

0

sütun sayısı büyükse, sizin istediğiniz gibi geçici tablodaki verileri değiştirmek, daha sonra orijinal haline geri geçici tablonun içeriğini kopyalamak, geçici bir tabloya istediğiniz verileri kopyalayabilirsiniz ve geçici tabloyu silin.