2012-02-07 29 views
10

Bir tabloyu eklemeye çalışıyorum ve bir sütun için bir seçim deyimi kullanıyor. Aşağıda, sorgularımın resmidir.ORA-00907 Eksik Sağ Parantez sorunu - iç sorgulama sorgusuyla seçin

INSERT INTO MY_TBL (MY_COL1, MY_COL2) 
VALUES (
(SELECT DATA FROM FIR_TABL WHERE ID = 1 AND ROWNUM = 1 ORDER BY CREATED_ON DESC), 
1 
); 

ORA-00907 Missing right Parenthesis. Bundan ORDER BY'u kaldırırsam, beklendiği gibi çalışır. Ama sipariş vermem gerek. Lütfen açıkla.

Şimdiden teşekkürler.

+4

bir RDBMS tabloya eklenen verilerin sipariş üzerine "itimat" eğer ben senin veri modelini soru olacaktır:

Bu

hatayı önlemek olacaktır. Ekleme sırası ilgisiz olmalı, verileri sorguladığınızda sipariş verdiğinizde. – Ollie

+0

Bu bağlamda “SİPARİŞ BY” in sizin için ne yapacağını düşünüyorsunuz? –

+0

Bir örnek verdim, bu seçim için birden çok satır olabilir. Ayrıca, MY_TBL'de birçok sütun var. Lütfen güncellememi kontrol et. – Vaandu

cevap

20

güncel cevaplar Her ikisi de aynı sorguda order by ve rownum kullanarak doğal olarak tehlikeli olduğunu görmezden:

INSERT INTO MY_TBL (MY_COL) 
SELECT DATA FROM FIR_TABL WHERE ID = 1 ORDER BY CREATED_ON DESC 
; 

Düzenlenmiş sorgu gibi görünecektir. İstediğiniz verileri alacağınızın kesinlikle bir garantisi yoktur. Eğer bir alt sorgu kullanmalıdır sıralı sorgudan ilk satırı isterseniz:

insert into my_tbl (col1, col2) 
select data, 'more data' 
    from (select data 
      from fir_tabl 
      where id = 1 
      order by created_on desc) 
where rownum = 1 
     ; 

Ayrıca, istediğiniz yönteminde veri sipariş rank gibi bir işlev kullanabilirsiniz Eğer iki olsaydı gerçi created_on tarihleri, rnk = 1 ile 2 değeriyle sonuçlanırdı.

insert into my_tbl (col1, col2) 
select data, 'more data' 
    from (select data 
       , rank() over (order by created_on desc) as rnk 
      from fir_tabl 
      where id = 1) 
where rnk = 1 
     ; 
+0

Bu, Oracle için düzeltmek gibi görünüyor. Ekstra bir alt sorguyu ve "doğru parantezi" (bir parantez eksik olmasa bile) mesajı kullanacak şekilde dönüştürün. Teşekkürler! – rogerdpack

+0

Aynı sorguda sipariş ve rownum kullanmanın doğal olarak tehlikeli olduğu hakkında herhangi bir referans var mı? – jeromerg

+0

Eminim Tom Kate bir şey @jeromerg yazmış olacak, ama ilk ilkelerden görebilmeniz gerekir. Bir yığın tablo depolanır ve bu nedenle alınamaz. ORDER BY cümlesi her zaman gerçekleşecek son işlemdir. Bu nedenle, ROWNUM yüklemi, sırasız bir kümenin siparişi vermeden önce kullanılacaktır. Önce sipariş vermeniz ve bir SQL deyiminin işleyiş sırasından dolayı siparişin bir iç seçimde olması gerekir (FETCH N ROWS sözdizimi ile birlikte 12c'ye kadar) – Ben

0

VALUES anahtar sözcüğünü kullanırken SELECT kullanmazsınız. Bunu kullan:

INSERT INTO MY_TBL (MY_COL1, MY_COL2) 
SELECT DATA, 1 FROM FIR_TABL WHERE ID = 1 AND ROWNUM = 1 ORDER BY CREATED_ON DESC 
; 
0

Bunu eklerken, verileri değil çıkarılırken o sipariş yapılmalıdır katılıyorum. Ancak, bir geçici çözüm olarak, ORDER BY deyimini, tüm SELECT'inizi başka bir SELECT'e dönüştüren INSERT öğesinden ayırabilirsiniz.

INSERT INTO MY_TABLE (
SELECT * FROM (
    SELECT columns 
    FROM table 
    ORDER BY clause 
    ) 
)