4

同じテーブル (学生テーブル) の別の列と別のテーブル (学校のテーブル) の列に基づいて列を更新しようとしています。

コードは次のとおりです。

update student_table
set student_code =
(select l.student_code
from school_table l, student_table n
where l.school = n.schoolname)

次のエラーが表示されます

ORA - 01427 単一行のサブクエリが複数の行を返します

どんな助けでも大歓迎です。

4

6 に答える 6

5

サブクエリを実行すると、複数の行が返されることがわかります。サブクエリの結果と等しくなるように列を更新しようとしているため、1 つの値のみが必要です。max() や min() を使用するなど、1 行のみを返すようにサブクエリを制限する必要があります。試す:

update student_table n
set student_code =
(select l.student_code
from school_table l
where l.school = n.schoolname);
于 2012-04-02T03:24:20.477 に答える
3

あなたが成し遂げようとしていることについて、わかりやすい英語で説明しておくと役に立ちます。そうは言っても、次のSQL(school_tableとstudent_tableの間の1対多の関係を想定)を使用して、外部の更新ステートメントと相互に関連するサブクエリとして内部の選択を行うことで、やりたいことを達成できるようです。

update student_table 
set student_code = (select l.student_code 
                    from school_table 
                    where school_table.school = student_table.schoolname) 
;

お役に立てれば。

よろしく、ロジャー

于 2012-04-03T14:15:55.677 に答える
3

私たちは皆、エラーが何を言っているのかを正確に知っています。SET は、列ごとに 1 つの値のみが設定されることを想定しています。達成したいのは、別のテーブルの列の値を使用して、特定の列のすべての行を更新することです。

これが解決策です:

BEGIN
For i in (select col_X, col_Y from table1) 
LOOP
Update table2 set col1 = i.col_X where col2 = i.col_Y;
END LOOP;
END;

これが、SQLDeveloper ワークシートで正確に実行する方法です。彼らはそれが遅いと言いますが、それがこのケースで私のために働いた唯一の解決策です.

于 2013-06-27T02:54:12.107 に答える
0

内部クエリの出力を 1 つの値に制限して、クエリを正常に実行します。

select l.student_code
from school_table l, student_table n
where l.school = n.schoolname 

これをチェックして

于 2012-04-02T06:36:10.063 に答える
-1

リストの値を気にしない場合、またはそれらが同じであることを確認する場合は、サブクエリ条件に rownum=1 を追加してみてください。

于 2014-12-16T08:49:42.913 に答える