2016-04-05 9 views
0

Kimlik numaraları eşleşiyorsa, bir tablodaki adları karşılık gelen bir tablodaki eşleşen adlarla güncelleştirmeye çalışıyorum. Tabloda bir sütun olarak var olsa bileİlişkilendirilmiş güncelleştirmeyi gerçekleştirirken Eksik Ekspresyon

SQL Error: ORA-00936: missing expression 

o T1.id o döndüren güncelleme ayrı select deyimi çalışan geçerli bir tanımlayıcı değildir:

UPDATE Table1 t1 
    SET NAME = SELECT (t2.name 
          FROM table2 t2 
           WHERE t1.ID = t2.ID); 

Bu

döndürülür hatadır .

Bir sözdizimini PSOUG ile eşleştirdiğimi hissediyorum.

+2

gibi değerlere sahip! 'Id' dosyasını saklayın ve isme ihtiyacınız olduğunda isme bakın. İlişkisel veritabanları bu şekilde çalışır. –

+0

İlk tablo için eksik adları doldurmaya çalışıyorum. İkinci tablo sadece geçicidir. –

cevap

2

açılış parantez değil ondan sonra, select önce olması gerekiyor:

UPDATE Table1 t1 
SET NAME = (SELECT t2.name 
         FROM table2 t2 
          WHERE t1.ID = t2.ID); 

bütün alt sorgu parantez içindedir. Bağlandığınız PSOUG sayfasının üçüncü örneğinde, "Tek bir sorgulanmış değere göre güncelleme"; ve the examples in the documentation göster. Basit tablo set-up ile

Hızlı demo:

create table table1 (id number, name varchar2(10)); 
insert into table1 values (1, null); 
insert into table1 values (2, 'Old name'); 
insert into table1 values (3, null); 

create table table2 (id number, name varchar2(10)); 
insert into table2 values (1, 'New name 1'); 
insert into table2 values (2, 'New name 2'); 

sorudan Orijinal kod alır:

Error report - 
SQL Error: ORA-00936: missing expression 
00936. 00000 - "missing expression" 

Yukarıdaki kod çalışır:

UPDATE Table1 t1 
SET NAME = (SELECT t2.name 
         FROM table2 t2 
          WHERE t1.ID = t2.ID); 

3 rows updated. 

select * from table1; 

     ID NAME  
---------- ---------- 
     1 New name 1 
     2 New name 2 
     3   

Bir yorumdan mig olduğunu düşünüyorsun ht alt sorguda table1 başka başvuru olması gerekir, ama bunu yaparsanız tablo hala güncellenen bir takma adı ediliyor olsa bile, güncelleme ve alt sorgu sıraları arasındaki korelasyonu kaybetmek:

UPDATE Table1 t1 
SET NAME = (
    SELECT t2.name 
    FROM table1 t1 
    JOIN table2 t2 
    ON t1.ID = t2.ID); 

Error report - 
SQL Error: ORA-01427: single-row subquery returns more than one row 
01427. 00000 - "single-row subquery returns more than one row" 

bu yanlış ile Alt sorgudaki table1 ve t1 diğer adlarını, table1 veya t1 dış update ... yan tümcesinde hiçbir ilişkiniz yoktur.

+0

Hala değiştiğinde aynı hatayı döndürüyor. –

+1

@YungDouglas - cevaptaki kod ORA-00936'yı atmıyor, bu yüzden ne yaptığınızı hiçbir fikriniz yok. –

+0

T1.ID'nin gelmesi gereken tabloyu dahil etmediğimi fark ettim. sonra tablo1 t1 eklerseniz, birden çok satır döndüren bir alt sorgu alır. Burada doğru sözdizimi nedir? –

0

Bu, yalnızca her bir kimlik için tablo2'de benzersiz bir ad varsa geçerlidir.

UPDATE Table1 t1 
SET NAME = (SELECT t2.name 
        FROM table2 t2 
         WHERE t1.ID = t2.ID); 

Örnek: tablo2 cases.If aşağıdaki
sorgu döndürür Yapmayın

name id 
    x 1 
    y 1 
+0

Bu kod, dün gönderdiğim tam olarak nedir? Ancak ismin benzersiz olması gerekmiyor, ID benzersiz olmalıydı. –

İlgili konular