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不会猜测它应该只返回一行,因为它可以使用特定的数据,您必须告诉它,以及如何做到这一点。