Sql 基于另一个表更新行

Sql 基于另一个表更新行,sql,oracle,Sql,Oracle,我创建了一个名为SALE\u REP的表,共有4列,employee\u id,name,salary和commission\u pct 我从现有的EMPLOYEES表填充了SALE\u REP表。现在,我想使用基于另一个表的值的子查询来更新SALE\u REP表中一些员工的工资 update sale_rep set salary = (select salary from employees where job_id = 'ad_vp') where employee_id = (sel

我创建了一个名为
SALE\u REP
的表,共有4列,
employee\u id
name
salary
commission\u pct

我从现有的
EMPLOYEES
表填充了
SALE\u REP
表。现在,我想使用基于另一个表的值的子查询来更新
SALE\u 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:

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

您有两个子查询,如果您的数据基于标准HR架构的employee表,那么这两个子查询都将返回多行

二是直截了当,;
=
需要位于
中:

where employee_id in (select employee_id from employees 
  where commission_pct = 0.35)
。。。它匹配我的模式中
employee
表中的三行。(虽然正如您所说,您的
sale_rep
表是由
employees
填充的,并且有
commission_pct
列,但您实际上不需要在此处使用子查询-您要更新的表上存在筛选值,因此您可能只需执行
其中commission_pct=0.35

第一个更难,你需要定义你想要实际发生什么。例如,您可以从与指定的
职务id
匹配的人员中选择最高工资:

set salary = (select max(salary) from employees
  where job_id = 'SA_REP')
我选择了
“sau REP”
,因为它看起来可能是一个销售代表,在我的模式中有30个匹配行和20个不同的值。根据您的编辑,我的模式中有两行是关于
AD\u 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

更一般地说,您要更新的行和您选择的值之间可能需要有某种联系,而不是佣金百分比,这看起来与工作无关。不过,在这种情况下,这似乎正是您想要的。

ad\u vp
来自哪里?您是否希望每个
工作id
只有一个人,或者所有员工的工资都相同?也许你可以添加一些样本数据和预期的最终结果。我正试图将35%佣金的员工的工资提升到ad_vp@Alex职位的员工的工资——我同意你的看法,我现在明白了。谢谢谢谢,我已经注意到了你的建议,我实际上想要实现的是使用子查询更新多行。但是,在我的模式中,“AD_VP”只有两行,并且都有相同的值,我认为这不应该是一个问题。它们的值不一样。@ayoola-仍然是两行-您需要使用distinct或聚合(如max),因此子查询只返回一行。这就是我在回答中所说的。Oracle不会猜测它应该只返回一行,因为它可以使用特定的数据,您必须告诉它,以及如何做到这一点。