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.
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. –
İlk tablo için eksik adları doldurmaya çalışıyorum. İkinci tablo sadece geçicidir. –