2017-09-29 4 views
0

Donc j'essaie de définir les valeurs de Overtime_Total. Pour calculer les heures supplémentaires, vous devez multiplier Overtime_hours (à partir de la table Overtime) et Overtime_Rate (à partir de la table Employee_type). Voici le problème, lorsque j'essaie de définir les valeurs en utilisant la commande suivante (commande 1), je reçois l'erreur ci-dessous. Cependant, lorsque j'utilise une autre commande (Command), elle affiche les valeurs correspondant à son ID.Le résultat d'un full scalaire fullselect plus d'une ligne lors de la tentative de mise à jour des valeurs set

commande 1

update Overtime 
set Overtime_total = 
(SELECT (OVERTIME.OVERTIME_HOURS * EMPLOYEE_TYPE.OVERTIME_RATE)AS OVERTIME_TOTAL 
FROM OVERTIME 
INNER JOIN EMPLOYEE_TYPE ON OVERTIME.EMP_TYPE_ID = EMPLOYEE_TYPE.EMP_TYPE_ID 
INNER JOIN SALARY ON SALARY.SALARY_ID = OVERTIME.SALARY_ID); 

commande 2

(SELECT Overtime.Overtime_ID,(OVERTIME.OVERTIME_HOURS * EMPLOYEE_TYPE.OVERTIME_RATE)AS OVERTIME_TOTAL 
FROM OVERTIME 
INNER JOIN EMPLOYEE_TYPE ON OVERTIME.EMP_TYPE_ID = EMPLOYEE_TYPE.EMP_TYPE_ID 
INNER JOIN SALARY ON SALARY.SALARY_ID = OVERTIME.SALARY_ID); 

erreur

The result of a scalar fullselect, SELECT INTO statement, or VALUES 
INTO statement is more than one row.. SQLCODE=-811, SQLSTATE=21000 

Table Overtime

Table Employee_type

Répondre

1

Vous devez donner condition id table principale en sous-requête

update Overtime ot 
    set Overtime_total = 
    (SELECT (t1.OVERTIME_HOURS * emp.OVERTIME_RATE)AS OVERTIME_TOTAL 
    FROM OVERTIME t1 
    INNER JOIN EMPLOYEE_TYPE emp ON t1.EMP_TYPE_ID = emp.EMP_TYPE_ID 
    INNER JOIN SALARY sal ON sal.SALARY_ID = t1.SALARY_ID where t1.EMP_TYPE_ID=ot.EMP_TYPE_ID and t1.overtime_id=ot.overtime_id); 

Vous pouvez également utiliser merge qui sera plus rapide que méthode ci-dessus

merge into Overtime ot 
using(
SELECT t1.overtime_id,t1.EMP_TYPE_ID,(t1.OVERTIME_HOURS * emp.OVERTIME_RATE)AS OVERTIME_TOTAL 
FROM OVERTIME t1 
INNER JOIN EMPLOYEE_TYPE emp ON t1.EMP_TYPE_ID = emp.EMP_TYPE_ID 
INNER JOIN SALARY sal ON sal.SALARY_ID = t1.SALARY_ID) st 
on ot.EMP_TYPE_ID=st.EMP_TYPE_ID and ot.overtime_id=st.overtime_id 
when matched then update set ot.Overtime_total=st.OVERTIME_TOTAL; 
+0

changement 'OVERTIME.OVERTIME_HOURS à ot.OVERTIME_HOURS '. Travaillé . Merci l'homme –

+0

ouais l'a changé en 't1' au lieu de' to' – Rams