2012-12-12 26 views
6
aşağıda sorgudan ORA-00947: not enough values alıyorum

:Oracle - SQL - seç alt ile takın

insert into tableb 
(colA, colb, colc, cold) 
select 
(select max(rec_no)+1 from tableb) 
F2, 
F3, 
F4 
from tablea; 

biri bana/select deyimini bir inser için bir alt sorgu dahil etmek doğru yolu işaret edebilir?

Teşekkürler

+5

Senden umut

sizin durumunuzda bir dizi değerleri oluşturmak için, belli ki öncelikle bir diziyi oluşturmak için gereken o max() 'yaklaşımını kullanarak benzersiz bir kimlik oluşturmaya çalışmayın. Çünkü sadece işe yaramayacak. –

+0

@a_horse_with_no_name dizisini daha iyi kullanmalısınız, aslında denediğim şey budur. Bunu bir sıra ile nasıl başaracağım hakkında bir tartışmaya bir link verebilir misiniz? Teşekkürler –

+1

Cevabımı görün. Sekans hala problemi çözmez, eğer tablea boşsa (David Aldridge'in bahsettiği gibi) –

cevap

13

Sadece bir virgül kaçırıyorsunuz. Oracle, F2'un alt seçiminizin adı olduğunu düşünüyor.

insert into tableb 
(colA, colb, colc, cold) 
select 
(select max(rec_no)+1 from tableb) , -- comma here 
F2, 
F3, 
F4 
from tablea; 
+1

Teşekkür ederiz! Çıldırıyordum! –

+1

Tabloda başlangıçta satır yoksa veya bu kodu aynı anda birden çok oturum çalıştırıyorsa çalışmaz. Ne yazık ki yaklaşım temelde kusurludur. –

+0

@David Aldridge masalar boş değil, bu kodu çalıştıran tek kişi benim. Daha iyi bir yöntem var mı? –

6

Benzersiz kimlikler oluşturmanın tek güvenilir, hızlı ve ölçeklenebilir yolu sıraları kullanmaktır.

"Çözüm" max() "çözümünün" çalışmamasının nedeni, işlemin başka bir işlemden gelen değiştirilmemiş değişiklikleri görmeyeceği anlamına gelir. Bu nedenle, iki eşzamanlı işlem, max() için aynı değeri kullanarak, aynı zamanda yinelenen kimlik değerlerini oluşturacaktır.

create sequence seq_b; 

Sonra select deyiminde bu diziyi kullanın::

insert into tableb 
    (colA, colb, colc, cold) 
select seq_b.nextval, 
     F2, 
     F3, 
     F4 
from tablea; 
+0

Keşif ve yardım için teşekkürler. –