有2张数据表 人员表 和卡表
实际一个人员可能匹配多张卡
当员工离职时,管理员会把人员名下所有的卡的状态改为离职。
之前由于没有这么作有大量的人员状态未修改
想写一个查询语句 或者存储过程
去查询2张表关联后 符合员工名下所有卡片状态均失效的时候 对人员表的一个辅助字段更新内容为离职 之类
类似找到这样的人员,并且更新人员表的某个字段
您好,您可以通过使用SQL语句以及关联查询来实现您所需的功能。具体步骤如下:
employee
,卡表为card
,并且两张表是通过employee_id
关联的,可以使用如下的查询语句:SELECT e.employee_id FROM employee e
WHERE NOT EXISTS (
SELECT 1 FROM card c
WHERE c.employee_id = e.employee_id AND c.status != '失效'
)
以上查询语句的含义是,在employee
表中查询,对于每一个员工,如果该员工名下存在一张卡状态不是失效
,则不符合要求。使用EXISTS
和NOT EXISTS
子查询可以方便地判断员工名下是否存在状态不是失效
的卡。
UPDATE
语句将这些员工的状态修改为离职。假设需要将员工的状态更新为离职,则可以使用如下的UPDATE
语句:UPDATE employee
SET status = '离职'
WHERE employee_id IN (
SELECT e.employee_id FROM employee e
WHERE NOT EXISTS (
SELECT 1 FROM card c
WHERE c.employee_id = e.employee_id AND c.status != '失效'
)
)
以上查询语句的含义是,在employee
表中查询符合前面查询条件的员工,并将这些员工的状态修改为离职。
将以上两个查询语句合并后,即可得到最终的解决方案。另外,如果想要定期执行此更新操作,可以将以上SQL语句封装成一个存储过程,并定期调用。
可以两张表做关联后做update的,这里有一篇不错的博客,供参考:https://www.cnblogs.com/b400800/p/16640320.html
1、需要考虑的问题:①、人员名下所有卡片均已失效(这里暂定状态为:OFF);②、有新人可能还未办理卡片,这部分人员不能被更新;③、只处理人员状态为”在职“的,更新为”离职“状态
大致SQL如下:(在MySQL5.7中使用类似表验证通过)
UPDATE USER u SET ca_state = '离职'
WHERE state = '在职'
AND EXISTS( SELECT 1 FROM card c
WHERE u.userid = c.userid
GROUP BY c.userid
HAVING min( ca_state ) = max( ca_state ) AND min( ca_state ) = 'OFF' );
当然,如果该辅助人员状态字段(SQL中暂定的state)是新建的,里面没有任何值,则需要将UPDATE部分WHERE中的 “ state = '在职' AND ”部分去掉才行。
先两张表关联找到对应的离职人员,在替换掉
UPDATE 人员表
SET CA_State = 'off'
WHERE PE_Code IN (
SELECT e.PE_Code FROM 人员表 e
join 卡表 c
on c.PE_Code = e.PE_Code
WHERE c.CA_State = '失效'
)
表呢,存储过程方便的很
不知道你这个问题是否已经解决, 如果还没有解决的话:source 文件名.sql
可以使用以下SQL语句进行人员表和卡表的关联查询,并更新人员表的辅助字段为离职:
UPDATE 人员表
SET 辅助字段 = '离职'
WHERE 人员id IN
(SELECT 人员id
FROM 卡表
WHERE 状态 != '失效'
GROUP BY 人员id
HAVING COUNT(卡号) = SUM(CASE WHEN 状态 != '失效' THEN 1 ELSE 0 END));
解释一下每一步: 1. 首先使用SELECT语句查询卡表,找出所有状态不为“失效”的卡片,分组后计算每个人员名下状态不为“失效”的卡片数量,如果数量等于该人员拥有的卡片总数量,说明该人员所有卡片状态均失效。 2. 使用IN子句将查询结果应用到UPDATE语句中,将该人员的辅助字段设为“离职”。
注:需要根据实际情况修改表名、字段名等信息。
如果有其他问题或解决方案无法正确解决问题,请联系更专业的IT专家进行处理。
update 卡表 c ,人员表 p
set c.状态 = '离职'
where p.状态 ='离职' and p.id = c.人员id