Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在WHERE子句中使用聚合函数更新表_Mysql_Sql_Triggers - Fatal编程技术网

Mysql 在WHERE子句中使用聚合函数更新表

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

我有两张员工和部门的桌子。它们与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)
我得到一个错误: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,我在示例数据库中测试了它,它工作正常