根据另一个表更新行

时间:2015-04-28 15:44:48

标签: sql oracle

我创建了一个名为SALE_REP的表格,其中包含4列,employee_idnamesalarycommission_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:

我做错了什么,如何成功执行更新?

1 个答案:

答案 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

更一般地说,您更新的行与您选择的值之间可能需要有一些联系,除了佣金百分比过滤器之外,它看起来并不相关工作。在这种情况下,这似乎确实是你想要的。