2015-04-28 194 views
0

我创建了一个名为SALE_REP的表,其中有4列employee_id,name,salarycommission_pct基于另一个表更新行

我从现有的EMPLOYEES表中填入SALE_REP表。现在我想使用基于另一个表中的值的子查询更新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

'ad_vp'从哪里来?你是否期望只有一个人拥有每个'job_id',或者所有雇员的薪水都相同?也许你可以添加一些样本数据和预期的最终结果。 –

+0

我试图升级员工的薪水35%的佣金,以ad_vp –

+0

@ Alex-我同意你的职位,我现在明白了。谢谢 –

回答

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'的,看起来像它可能是一个销售代表,并且具有20个不同的值30级匹配的行在我的模式中。根据您的编辑,我的架构中有两行,分别为AD_VP,但两者的薪水相同;其中使用max()可能是OK的情况下,或者你可以使用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 

更普遍的有可能需要比对的提成比例的过滤器,你要更新的行,你就尽管选择价值之间有着某种联系,其他,这与工作无关。这似乎是你想要在这种情况下,但。

+0

谢谢我注意到你的建议,我实际上打算达到的目标是使用子查询更新多行。然而,我的模式中的'AD_VP'只有2行,两者都具有相同的值,我认为这不应该是一个问题,它们并不具有不同的值。 –

+0

@ayoola - 它仍然是两行 - 你需要使用不同的,或聚合(如最大),所以子查询只返回一行。这就是我在答案中所展示的。 Oracle不会猜测它只应该返回一行,只是因为它可能与该特定数据相关联,您必须告诉它以及如何执行该操作。 –