0

次のスクリプトを実行しようとすると、エラーが発生します。

update my_employees_above_avg set (employee_id, first_name, last_name, salary) =
(select employee_id, first_name, last_name, (salary + 100) NewSalary
from my_employees_above_avg
where last_name like '%b%');

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

コマンドの 40 行目から始まるエラー:

update my_employees_above_avg set (employee_id, first_name, last_name, salary) =
(select employee_id, first_name, last_name, (salary + 100) NewSalary
from my_employees_above_avg
where last_name like '%b%')

エラーレポート:

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

エラーが発生する理由や原因、またはこのエラーを解決する方法を提案してください。

ありがとう、

4

2 に答える 2

0

employee_id, first_name, last_name, salaryクエリの問題は、テーブルのすべての行の列を更新しようとしていて、サブクエリが複数の行を返していることです。そのため、オラクルは、列で更新する結果の行を決定できません。その非常に論理的です。

たとえば、テーブル内のすべての従業員の部門を更新すると、サブクエリは 3 つの部門を返します。現在、テーブルで更新するサブクエリの値を決定する方法はありません。したがって、エラーがスローされます。

解決策は、サブクエリが単一の行を返すようにすることです。

また、給与を更新することだけを目的としている場合は、他の回答が正しい方法を説明しています。

于 2013-07-27T02:59:03.357 に答える
0

「%b%」のようなレコードごとにテーブルのsalaryフィールドを更新しようとしていると仮定すると、これが探しているものになります。my_employees_above_avglast_name

update my_employees_above_avg 
set salary = salary + 100
where last_name like '%b%'
于 2013-07-27T01:39:47.047 に答える