簡體   English   中英

在WHERE子句中使用聚合函數來更新表

[英]Using aggregate function in WHERE clause to UPDATE a table

我有兩個表員工部門 它們與dep_id列鏈接, dep_id列是部門中的主鍵和員工中的外鍵。

我的目標是:

更新所有員工的工資,這些員工的工資高於其所在部門的平均工資。 現在我有2個查詢來執行此操作:

UPDATE employee E 
SET E.payroll = E.payroll + 1000
WHERE E.payroll > (SELECT AVG(E2.payroll) FROM employee E2 WHERE E.dep_id = E2.dep_id)

我收到一個錯誤: #1093 - 表'E'被指定兩次,既作為'UPDATE'的目標又作為數據的單獨來源

2)在部門表中,我存儲每個部門的員工數量和每個部門的總工資單

UPDATE employee E 
SET E.payroll = E.payroll + 1000
WHERE E.payroll > (SELECT department.dep_payroll / department.dep_amount FROM department  WHERE department.dep_id = E.dep_id)

這個工作正常,但因為我有一個觸發器,在\\之前(我檢查雙向)更新員工表並更新dep_payroll后觸發它阻止我執行第二個查詢給出此錯誤#1442 - 無法更新表'部門'存儲函數/觸發器,因為它已被調用此存儲函數/觸發器的語句使用。 這里是

CREATE TRIGGER `t3` BEFORE UPDATE ON `employee`
 FOR EACH ROW UPDATE department
SET dep_payroll = dep_payroll - OLD.payroll + NEW.payroll
WHERE dep_id = NEW.dep_id

如何執行更新查詢?

考慮一個臨時表來存儲要更新的員工列表。 然后在單獨的查詢中運行更新:

create temporary table list (emp_id int)
;
insert  list
select  emp_id
from    YourTable emp
join    (
        select  dep_id
        ,       avg(payroll) as avg_pay
        from    YourTable
        group by
                dep_id
        ) dep
on      emp.dep_id = dep.dep_id
where   payroll > avg_pay
;
update  YourTable
set     payroll = payroll + 1000
where   emp_id in (select emp_id from list)
;

regtester的示例。

我不知道這是否是編寫此類查詢的最有效方式,感謝@ThorstenKettner我找到了答案

UPDATE employee E 
SET E.payroll = E.payroll + 1000
WHERE E.payroll >
(SELECT * FROM 
 (SELECT AVG(E2.payroll) FROM employee E2 INNER JOIN employee E ON E.dep_id = E2.dep_id) 
 X)

但是,它仍然沒有回答我的問題的第二部分..這是MySQL的一個缺陷還是錯誤的觸發器?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM