![](/img/trans.png)
[英]SQL update query using aggregate function and group by in where clause?
[英]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)
;
我不知道這是否是編寫此類查詢的最有效方式,感謝@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.