我创建了一个名为SALE_REP
的表格,其中包含4列,employee_id
,name
,salary
和commission_pct
。
我从现有的SALE_REP
表中填充了EMPLOYEES
表。现在我想根据另一个表中的值使用子查询来更新SALE_REP
表中某些员工的工资;
update sale_rep
set salary = (select salary from employees
where job_id = 'ad_vp')
where employee_id = (select employee_id from employees
where commission_pct = 0.35);
但这会得到;
SQL Error: ORA-01427: single-row subquery returns more than one row
01427. 00000 - "single-row subquery returns more than one row"
*Cause:
*Action:
我做错了什么,如何成功执行更新?
答案 0 :(得分:0)
您有两个子查询,如果您的数据基于标准HR模式的员工表,则两者都将返回多行。
第二个是直截了当的; =
需要in
:
where employee_id in (select employee_id from employees
where commission_pct = 0.35)
...匹配我的架构中employee
表中的三行。 (尽管正如您所说,sale_rep
表格填充在employees
并且commission_pct
列中,但您并不需要在此处使用子查询 - 表格中存在过滤器值您正在进行更新,因此您可能只需where commission_pct = 0.35
)。
第一个更难,你需要定义你想要实际发生的事情。例如,您可以从匹配指定job_id
的那些中选择最高薪水:
set salary = (select max(salary) from employees
where job_id = 'SA_REP')
我已选择'SA_REP'
,因为它看起来可能是销售代表,并且在我的架构中有30个匹配的行,其中包含20个不同的值。根据您的编辑,我的架构中有两行AD_VP
,但两者都有相同的工资;在这种情况下使用max()
可能没问题,或者您可以使用distinct
:
set salary = (select distinct salary from employees
where job_id = 'AD_VP')
但这对于您此时所拥有的数据非常具体,因此它不会是一个很好的一般模式。
将这些放在一起你可以做到:
select employee_id, salary from sale_rep where commission_pct = 0.35;
EMPLOYEE_ID SALARY
----------- ----------
156 10000
157 9500
158 9000
update sale_rep
set salary = (select max(salary) from employees
where job_id = 'AD_VP')
where employee_id in (select employee_id from employees
where commission_pct = 0.35);
3 rows updated.
select employee_id, salary from sale_rep where commission_pct = 0.35;
EMPLOYEE_ID SALARY
----------- ----------
156 17000
157 17000
158 17000
更一般地说,您更新的行与您选择的值之间可能需要有一些联系,除了佣金百分比过滤器之外,它看起来并不相关工作。在这种情况下,这似乎确实是你想要的。