2015-04-28 190 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不會猜測它只應該返回一行,只是因爲它可能與該特定數據相關聯,您必須告訴它以及如何執行該操作。 –