Mysql 在WHERE子句中使用聚合函数更新表
我有两张员工和部门的桌子。它们与dep_id列链接,dep_id列是部门中的主键,也是员工中的外键 我的目标是: 更新所有工资高于其部门平均工资的员工的工资。 现在,我有两个查询要执行此操作:Mysql 在WHERE子句中使用聚合函数更新表,mysql,sql,triggers,Mysql,Sql,Triggers,我有两张员工和部门的桌子。它们与dep_id列链接,dep_id列是部门中的主键,也是员工中的外键 我的目标是: 更新所有工资高于其部门平均工资的员工的工资。 现在,我有两个查询要执行此操作: 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) 我得到一个错误:10
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”被指定了两次,既作为“更新”的目标,也作为单独的数据源
2在部门表I中,存储每个部门的员工数量和每个部门的工资总额
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)
这一个工作正常,但因为我有一个触发器,它在我检查更新employee表和更新dep_payroll这两种方法之前\之后触发,所以它阻止我执行第二个查询,导致此错误
1442-无法更新存储函数/触发器中的表“department”,因为调用此存储函数/触发器的语句已使用该表。
给你
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中的缺陷还是错误写入的触发器?用于更新MySQL数据库的规则可能重复,因为它是标准的T-SQL语言。@MaciejLos,我没有看到这个。但是第二个查询呢?IIRC这是MySQL中的一个缺陷。不能使用where子句中正在更新的表。然而,它通常在你更深一层时起作用;类似于E.payroll>SELECT*FROM SELECT AVGE2.payroll FROM employee E2其中E.dep_id=E2.dep_id x.@ThorstenKettner,太神奇了,谢谢!我会把它发布在回答中。我不知道为什么子查询中有一个内部联接,这会多次计算很多员工。您也没有查看员工所在部门的平均工资:子查询与您正在更新的行之间没有链接。@Andomar,我在示例数据库中测试了它,它工作正常