2016-04-05 7 views
0

ID番号が一致する場合、対応するテーブルの一致する名前で1つのテーブルの名前を更新しようとしています。相関更新を実行する際に式が見つからない

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

これが返されるエラーです。

SQL Error: ORA-00936: missing expression 

それはT1.idが、それは表の列として存在するにもかかわらず、有効な識別子でないことを返す更新とは別にselect文を実行している場合。

私はPSOUGの構文と一致しているように感じます。

+2

のような値を持っています! 'id'を格納し、名前が必要なときに名前を調べます。これがリレーショナルデータベースの仕組みです。 –

+0

最初のテーブルの不足している名前を記入しようとしています。 2番目の表はちょうど一時的なものです。 –

答えて

2

左括弧がない、それの後に、select前にする必要があります:

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

全体サブクエリは、カッコ内にあります。 3番目の例では、リンクされたPSOUGページには、「照会された単一の値に基づいた更新」が表示されます。どのようなthe examples in the documentationが表示されます。

クイックデモ、簡単なテーブルセットアップで:

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'); 

質問からあなたの元のコードを取得します。

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

作品上記のコードを:

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   

あなたがmigと思うようなコメントからこの間違ったで

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" 

:HTまだ更新されているテーブルにエイリアスを持っている場合でも、サブクエリでtable1への別の参照を持っている必要がありますが、あなたは、あなたが更新とサブクエリの行の間の相関関係を失うことを行う場合サブクエリ内のtable1およびt1エイリアスは、外側のupdate ...節にあるtable1またはt1とは関係がありません。

+0

変更すると同じエラーが返されます。 –

+1

@ YungDouglas - 答えのコードはORA-00936を投げるわけではないので、あなたが何をしているのかは分かりません。 –

+0

私はt1.IDが来るはずのテーブルを含めていないことに気付きました。私はtable1の後にt1を追加すると、複数の行を返すサブクエリが得られます。ここで正しい構文は何ですか? –

0

これは、各IDのtable2に固有の名前がある場合にのみ有効です。

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

例:表2 cases.If以下で
クエリが返すには、それをしないでください

name id 
    x 1 
    y 1 
+0

そのコードはまさに私が昨日投稿したものですか?しかし、その名前はユニークである必要はなく、IDは一意でなければなりませんでした。 –

関連する問題